Mysql
 sql >> Datenbank >  >> RDS >> Mysql

2 Möglichkeiten, Zeilen zurückzugeben, die nur nicht-alphanumerische Zeichen in MySQL enthalten

Unten sind zwei Möglichkeiten, um die Zeilen zu finden, die in MySQL nur nicht-alphanumerische Zeichen enthalten.

Nicht-alphanumerische Zeichen umfassen Satzzeichen wie [email protected]#&()–[{}]:;',?/* und Symbole wie `~$^+=<>“ , sowie Whitespace-Zeichen wie Leerzeichen oder Tabulatorzeichen.

Beispieldaten

Wir verwenden die folgenden Daten für unsere Beispiele:

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;

Ergebnis:

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

Option 1:Vergleiche mit [:alnum:]

Wir können MySQLs REGEXP verwenden -Operator, um unsere Spalte mit einem regulären Ausdruck zu vergleichen.

Die Funktion für reguläre Ausdrücke von MySQL umfasst die Unterstützung der POSIX-Zeichenklassen. Daher können wir den [:alnum:] verwenden POSIX-Zeichenklasse in unseren regulären Ausdrücken, um die Zeilen zu finden, die nur alphanumerische Zeichen enthalten, und negieren Sie dies dann mit NOT Betreiber.

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

Ergebnis:

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

Wenn Sie ein bestimmtes Zeichen ausschließen müssen, können Sie immer NULLIF() verwenden Funktion.

Lassen Sie uns beispielsweise die leere Zeichenfolge aus der letzten Zeile ausschließen:

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

Ergebnis:

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

Option 2:Geben Sie einen Zeichenbereich an

Eine andere Möglichkeit besteht darin, einen Bereich von Zeichen in Ihrem regulären Ausdruck anzugeben.

Beispiel:

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

Ergebnis:

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

Und um die leere Zeichenfolge zu entfernen:

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

Ergebnis:

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

In diesem Fall umfasste mein Ausschlussbereich keine alphanumerischen Zeichen wie é , É , und ø , und daher ist die Ausgabe keine echte Darstellung von nicht-alphanumerischen Zeichen. Allerdings gibt Ihnen diese Methode zumindest die Möglichkeit, die genauen Zeichen anzugeben, die Sie in das Ergebnis einbeziehen oder aus diesem ausschließen möchten.

Alternativen zu REGEXP

In MySQL ist das RLIKE und REGXP Operatoren sind Synonyme für REGEXP_LIKE() . Daher können wir jedes der vorherigen Beispiele durch NOT RLIKE ersetzen oder NOT REGEXP_LIKE() .

Beispiel für RLIKE :

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

Beispiel für REGEXP_LIKE() :

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