sql >> Databasteknik >  >> RDS >> MariaDB

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

Nedan finns två metoder för att returnera rader som endast innehåller alfanumeriska tecken i MariaDB.

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:]

MariaDB:s reguljära uttryckskapacitet 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.

Observera att 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 ange ett antal tecken i ditt reguljära uttryck.

Exempel:

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

Resultat:

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

Du kommer att märka att detta gav färre rader än med vårt första exempel. Detta 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             |
+-------------------+

  1. Välj count(*) från flera tabeller

  2. MySQL, Sammanfoga två kolumner

  3. Jämföra metoder för strängdelning/sammansättning

  4. Hur jämför man den nuvarande raden med nästa och föregående rad i PostgreSQL?