sql >> Databasteknik >  >> RDS >> Mysql

2 sätt att returnera rader som innehåller alfanumeriska tecken i MySQL

Nedan finns två alternativ för att hitta de rader som innehåller alfanumeriska tecken i MySQL.

Alfanumeriska tecken är alfabetiska tecken och numeriska tecken.

Exempeldata

Vi använder följande data för våra exempel:

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;

Resultat:

+----------------------+
| 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                |
+----------------------+

Alternativ 1:Jämför med [:alnum:]

Vi kan använda MySQL:s REGEXP operatorn för att jämföra vår kolumn med ett reguljärt uttryck.

MySQL:s kapacitet för reguljära uttryck inkluderar stöd för POSIX-teckenklasserna. Därför kan vi använda [:alnum:] POSIX-teckenklass i våra reguljära uttryck för att hitta de rader som innehåller alfanumeriska tecken.

SELECT c1 FROM t1 
WHERE c1 REGEXP '^[[:alnum:]]+$';

Resultat:

+-------+
| c1    |
+-------+
| Music |
| Café  |
| 007   |
| é     |
| É     |
| ø     |
+-------+

Det returnerade bara de rader som inte innehåller annat än alfanumeriska tecken. Om en rad innehåller både alfanumeriska och icke-alfanumeriska tecken, returneras den inte.

Mellanslagstecknet anses vara icke-alfanumeriskt, så om vi vill inkludera mellanslag kan vi göra detta:

SELECT c1 FROM t1 
WHERE c1 REGEXP '^[[:alnum:] ]+$';

Resultat:

+---------------+
| c1            |
+---------------+
| Music         |
| Live Music    |
| Café          |
| Café Del Mar  |
| 100 Cafés     |
| Player 456    |
| 007           |
| é             |
| É             |
| é 123         |
| ø             |
| ø 123         |
+---------------+

För att returnera alla rader som innehåller alfanumeriska tecken (även om raden också innehåller icke-alfanumeriska tecken), kan vi göra detta:

SELECT c1 FROM t1 
WHERE c1 REGEXP '[[:alnum:]]';

Resultat:

+-------------------+
| c1                |
+-------------------+
| Music             |
| Live Music        |
| Café              |
| Café Del Mar      |
| 100 Cafés         |
| [email protected] |
| 1 + 1             |
| $1.50             |
| Player 456        |
| 007               |
| é                 |
| É                 |
| é 123             |
| ø                 |
| ø 123             |
+-------------------+

Alternativ 2:Ange ett antal tecken

Ett annat sätt att göra det är att tillhandahålla ett reguljärt uttryck som tillhandahåller en rad tecken. Vi kan fortfarande använda REGEXP operatör för att göra detta.

Exempel:

SELECT c1 FROM t1 
WHERE c1 REGEXP '^[A-Za-z0-9]+$';

Resultat:

+-------+
| c1    |
+-------+
| Music |
| 007   |
+-------+

Detta gav färre rader än med vårt första exempel. Det beror på att jag inte inkluderade é , É , eller ø tecken i mitt intervall, så alla rader som innehåller dessa tecken exkluderas från utdata.

Därför måste du vara försiktig när du använder den här metoden, om du av misstag utesluter tecken som du bör inkludera.

Men med detta intervall kan vi inkludera utrymmen som detta:

SELECT c1 FROM t1 
WHERE c1 REGEXP '^[A-Za-z0-9 ]+$';

Resultat:

+------------+
| c1         |
+------------+
| Music      |
| Live Music |
| Player 456 |
| 007        |
+------------+

Och vi kan använda följande för att inkludera alla rader som innehåller tecken från vårt intervall (även om de också innehåller tecken utanför detta intervall):

SELECT c1 FROM t1 
WHERE c1 REGEXP '[A-Za-z0-9]';

Resultat:

+-------------------+
| c1                |
+-------------------+
| Music             |
| Live Music        |
| Café              |
| Café Del Mar      |
| 100 Cafés         |
| [email protected] |
| 1 + 1             |
| $1.50             |
| Player 456        |
| 007               |
| é 123             |
| ø 123             |
+-------------------+

Alternativ till REGEXP

I MySQL, RLIKE och REGXP operatorer är synonymer för REGEXP_LIKE() . Därför kan vi ersätta vilket som helst av de tidigare exemplen med RLIKE eller REGEXP_LIKE() .

Exempel på RLIKE :

SELECT c1 FROM t1 
WHERE c1 RLIKE '^[[:alnum:]]+$';

Exempel på REGEXP_LIKE() :

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');

  1. R12.2 Online patchningscykel Sammanfattning

  2. Finns det en LastIndexOf i SQL Server?

  3. Fel syntax nära "GO"

  4. Ansluter SQL Server till Oracle