sql >> Databasteknik >  >> RDS >> Mysql

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

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

Icke-alfanumeriska tecken inkluderar skiljetecken som [email protected]#&()–[{}]:;',?/* och symboler som `~$^+=<>“ , såväl som blanksteg som blanksteg eller tabbtecken.

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 bara innehåller alfanumeriska tecken, förneka sedan det med NOT operatör.

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

Resultat:

+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
|                      |
+----------------------+

Om du behöver utesluta ett specifikt tecken kan du alltid använda NULLIF() fungera.

Låt oss till exempel utesluta den tomma strängen från den sista raden:

SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]';

Resultat:

+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
+----------------------+

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 NOT REGEXP '[A-Za-z0-9]';

Resultat:

+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
|                      |
| é                    |
| É                    |
| ø                    |
+----------------------+

Och för att ta bort den tomma strängen:

SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]';

Resultat:

+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
| é                    |
| É                    |
| ø                    |
+----------------------+

I det här fallet täckte inte mitt uteslutningsintervall alfanumeriska tecken som é , É och ø , och så utdata är inte en sann representation av icke-alfanumeriska tecken. Som sagt, åtminstone den här metoden ger dig möjlighet att ange exakt de tecken du vill inkludera eller utesluta från resultatet.

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 NOT RLIKE eller NOT REGEXP_LIKE() .

Exempel på RLIKE :

SELECT c1 FROM t1 
WHERE c1 NOT RLIKE '[[:alnum:]]';

Exempel på REGEXP_LIKE() :

SELECT c1 FROM t1 
WHERE NOT REGEXP_LIKE(c1, '[[:alnum:]]');

  1. Hur man ansluter till MySQL med Node.js

  2. Hur man använder stoppord och stopplista för att förbättra SQL Server Full-Text Search (FTS)

  3. Hur man tar bort en främmande nyckelbegränsning i SQL

  4. Postgresql DROP TABLE fungerar inte