Níže jsou uvedeny dvě možnosti, jak v MySQL najít ty řádky, které obsahují pouze nealfanumerické znaky.
Nealfanumerické znaky zahrnují interpunkční znaky jako [email protected]#&()–[{}]:;',?/*
a symboly jako `~$^+=<>“
, stejně jako mezery, jako jsou mezery nebo tabulátory.
Ukázková data
Pro naše příklady použijeme následující data:
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;
Výsledek:
+----------------------+ | 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 | +----------------------+
Možnost 1:Porovnejte s [:alnum:]
Můžeme použít REGEXP
MySQL operátor k porovnání našeho sloupce s regulárním výrazem.
Schopnost regulárních výrazů MySQL zahrnuje podporu pro znakové třídy POSIX. Proto můžeme použít [:alnum:]
Třída znaků POSIX v našich regulárních výrazech, abyste našli řádky, které obsahují pouze alfanumerické znaky, a poté to negujte pomocí NOT
operátor.
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[[:alnum:]]';
Výsledek:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | +----------------------+
Pokud potřebujete vyloučit konkrétní znak, můžete vždy použít NULLIF()
funkce.
Vynechme například prázdný řetězec z posledního řádku:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]';
Výsledek:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | +----------------------+
Možnost 2:Určete rozsah znaků
Dalším způsobem, jak to udělat, je zadat rozsah znaků v regulárním výrazu.
Příklad:
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[A-Za-z0-9]';
Výsledek:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | | é | | É | | ø | +----------------------+
A pro odstranění prázdného řetězce:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]';
Výsledek:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | é | | É | | ø | +----------------------+
V tomto případě můj rozsah vyloučení nepokrýval alfanumerické znaky jako é
, É
a ø
, takže výstup není skutečnou reprezentací nealfanumerických znaků. To znamená, že alespoň tato metoda vám dává možnost určit přesné znaky, které chcete zahrnout nebo vyloučit z výsledku.
Alternativy k REGEXP
V MySQL, RLIKE
a REGXP
operátory jsou synonyma pro REGEXP_LIKE()
. Proto můžeme kterýkoli z předchozích příkladů nahradit výrazem NOT RLIKE
nebo NOT REGEXP_LIKE()
.
Příklad RLIKE
:
SELECT c1 FROM t1
WHERE c1 NOT RLIKE '[[:alnum:]]';
Příklad REGEXP_LIKE()
:
SELECT c1 FROM t1
WHERE NOT REGEXP_LIKE(c1, '[[:alnum:]]');