По-долу са дадени два метода за връщане на редове, които съдържат само небуквени и цифрови знаци в MariaDB.
Небуквени и цифрови знаци включват препинателни знаци като [email protected]#&()–[{}]:;',?/*
и символи като `~$^+=<>“
, както и празни знаци като интервалите или табулацията.
Примерни данни
Ще използваме следните данни за нашите примери:
CREATE TABLE t1 (
c1 varchar(255) NULL
);
INSERT INTO t1 VALUES
('Music'),
('Live Music'),
('Café'),
('Café Del Mar'),
('100 Cafés'),
('[email protected]'),
('1 + 1'),
('()'),
('[email protected]#&()–[{}]:;'',?/*'),
('`~$^+=<>“'),
('$1.50'),
('Player 456'),
('007'),
(null),
(''),
('é'),
('É'),
('é 123'),
('ø'),
('ø 123');
SELECT c1 FROM t1;
Резултат:
+----------------------+ | c1 | +----------------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | [email protected] | | 1 + 1 | | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | $1.50 | | Player 456 | | 007 | | NULL | | | | é | | É | | é 123 | | ø | | ø 123 | +----------------------+
Опция 1:Сравнете с [:alnum:]
Възможността за регулярни изрази на MariaDB включва поддръжка за POSIX символните класове. Следователно можем да използваме [:alnum:]
POSIX клас символи в нашите регулярни изрази, за да намерите редовете, които съдържат само буквено-цифрови знаци, след което отричайте това с NOT
оператор.
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[[:alnum:]]';
Резултат:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | +----------------------+
Ако трябва да изключите конкретен знак, винаги можете да използвате NULLIF()
функция.
Например, нека изключим празния низ от последния ред:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]';
Резултат:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | +----------------------+
Опция 2:Посочете диапазон от знаци
Друг начин да го направите е да посочите диапазон от знаци във вашия регулярен израз.
Пример:
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[A-Za-z0-9]';
Резултат:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | | é | | É | | ø | +----------------------+
И за да премахнете празния низ:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]';
Резултат:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | é | | É | | ø | +----------------------+
В този случай моят диапазон на изключване не обхваща буквено-цифрови знаци като é
, É
и ø
, и така изходът не е истинско представяне на небуквени и цифрови знаци. Въпреки това поне този метод ви дава възможност да посочите точните знаци, които искате да включите или изключите от резултата.