Hieronder staan twee opties om die rijen te vinden die alfanumerieke tekens bevatten in MySQL.
Alfanumerieke tekens zijn alfabetische tekens en numerieke tekens.
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 alfanumerieke tekens bevatten.
SELECT c1 FROM t1
WHERE c1 REGEXP '^[[:alnum:]]+$';
Resultaat:
+-------+ | c1 | +-------+ | Music | | Café | | 007 | | é | | É | | ø | +-------+
Dat leverde alleen die rijen op die alleen alfanumerieke tekens bevatten. Als een rij zowel alfanumerieke als niet-alfanumerieke tekens bevat, wordt deze niet geretourneerd.
Het spatieteken wordt als niet-alfanumeriek beschouwd, dus als we spaties willen opnemen, kunnen we dit doen:
SELECT c1 FROM t1
WHERE c1 REGEXP '^[[:alnum:] ]+$';
Resultaat:
+---------------+ | c1 | +---------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | Player 456 | | 007 | | é | | É | | é 123 | | ø | | ø 123 | +---------------+
Alle rijen retourneren die bevatten alfanumerieke tekens (zelfs als de rij ook niet-alfanumerieke tekens bevat), kunnen we dit doen:
SELECT c1 FROM t1
WHERE c1 REGEXP '[[:alnum:]]';
Resultaat:
+-------------------+ | c1 | +-------------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | [email protected] | | 1 + 1 | | $1.50 | | Player 456 | | 007 | | é | | É | | é 123 | | ø | | ø 123 | +-------------------+
Optie 2:specificeer een reeks tekens
Een andere manier om dit te doen, is door een reguliere expressie aan te bieden die een reeks tekens biedt. We kunnen nog steeds de REGEXP
. gebruiken operator om dit te doen.
Voorbeeld:
SELECT c1 FROM t1
WHERE c1 REGEXP '^[A-Za-z0-9]+$';
Resultaat:
+-------+ | c1 | +-------+ | Music | | 007 | +-------+
Dit leverde minder rijen op dan bij ons eerste voorbeeld. Dat komt omdat ik de é
. niet heb opgenomen , É
, of ø
tekens in mijn bereik, en dus worden alle rijen die deze tekens bevatten uitgesloten van de uitvoer.
Daarom moet u voorzichtig zijn bij het gebruik van deze methode, voor het geval u per ongeluk tekens uitsluit die u zou moeten opnemen.
Binnen dit bereik kunnen we echter spaties als deze opnemen:
SELECT c1 FROM t1
WHERE c1 REGEXP '^[A-Za-z0-9 ]+$';
Resultaat:
+------------+ | c1 | +------------+ | Music | | Live Music | | Player 456 | | 007 | +------------+
En we kunnen het volgende gebruiken om alle rijen op te nemen die bevatten tekens uit ons assortiment (zelfs als ze ook tekens buiten dit bereik bevatten):
SELECT c1 FROM t1
WHERE c1 REGEXP '[A-Za-z0-9]';
Resultaat:
+-------------------+ | c1 | +-------------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | [email protected] | | 1 + 1 | | $1.50 | | Player 456 | | 007 | | é 123 | | ø 123 | +-------------------+
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 RLIKE
of REGEXP_LIKE()
.
Voorbeeld van RLIKE
:
SELECT c1 FROM t1
WHERE c1 RLIKE '^[[:alnum:]]+$';
Voorbeeld van REGEXP_LIKE()
:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');