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 example@sqldat.com#&()–[{}]:;',?/* 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'),
('example@sqldat.com'),
('1 + 1'),
('()'),
('example@sqldat.com#&()–[{}]:;'',?/*'),
('`~$^+=<>“'),
('$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 |
| example@sqldat.com |
| 1 + 1 |
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
| $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 |
+----------------------+
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
| |
+----------------------+
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 |
+----------------------+
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
+----------------------+ 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 |
+----------------------+
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
| |
| é |
| É |
| ø |
+----------------------+ 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 |
+----------------------+
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
| é |
| É |
| ø |
+----------------------+
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:]]');