Hieronder staan twee opties om die rijen te vinden die alleen niet-alfanumerieke tekens bevatten in MySQL.
Niet-alfanumerieke tekens omvatten leestekens zoals [email protected]#&()–[{}]:;',?/*
en symbolen zoals `~$^+=<>“
, evenals witruimtetekens zoals de spatie of tabtekens.
Voorbeeldgegevens
We gebruiken de volgende gegevens voor onze voorbeelden:
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;
Resultaat:
+----------------------+ | 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 | +----------------------+
Optie 1:Vergelijk met [:alnum:]
We kunnen MySQL's REGEXP
. gebruiken operator om onze kolom te vergelijken met een reguliere expressie.
De reguliere expressiemogelijkheid van MySQL omvat ondersteuning voor de POSIX-tekenklassen. Daarom kunnen we de [:alnum:]
. gebruiken POSIX-tekenklasse in onze reguliere expressies om de rijen te vinden die alleen alfanumerieke tekens bevatten, negeer dat dan met de NOT
telefoniste.
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[[:alnum:]]';
Resultaat:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | +----------------------+
Als u een specifiek teken moet uitsluiten, kunt u altijd de NULLIF()
. gebruiken functie.
Laten we bijvoorbeeld de lege tekenreeks uit de laatste rij uitsluiten:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]';
Resultaat:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | +----------------------+
Optie 2:specificeer een reeks tekens
Een andere manier om dit te doen, is door een reeks tekens in uw reguliere expressie op te geven.
Voorbeeld:
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[A-Za-z0-9]';
Resultaat:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | | é | | É | | ø | +----------------------+
En om de lege string te verwijderen:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]';
Resultaat:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | é | | É | | ø | +----------------------+
In dit geval omvatte mijn uitsluitingsbereik geen alfanumerieke tekens zoals é
, É
, en ø
, en dus is de uitvoer geen echte weergave van niet-alfanumerieke tekens. Dat gezegd hebbende, deze methode geeft je in ieder geval de mogelijkheid om de exacte tekens op te geven die je wilt opnemen in of uitsluiten van het resultaat.
Alternatieven voor REGEXP
In MySQL is de RLIKE
en REGXP
operators zijn synoniemen voor REGEXP_LIKE()
. Daarom kunnen we elk van de voorgaande voorbeelden vervangen door NOT RLIKE
of NOT REGEXP_LIKE()
.
Voorbeeld van RLIKE
:
SELECT c1 FROM t1
WHERE c1 NOT RLIKE '[[:alnum:]]';
Voorbeeld van REGEXP_LIKE()
:
SELECT c1 FROM t1
WHERE NOT REGEXP_LIKE(c1, '[[:alnum:]]');