MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

Finden Sie alle nicht numerischen Werte in einer Spalte in MariaDB

Wenn Sie jemals auf eine Zeichenspalte stoßen, die eine numerische Spalte sein sollte, besteht immer die Möglichkeit, dass sie nicht numerische Daten enthält, von denen Sie nichts wissen.

In MariaDB können Sie eine Abfrage wie die folgende ausführen, um nicht numerische Daten aus der Spalte zurückzugeben.

Beispieldaten

Angenommen, wir erstellen eine Tabelle wie diese:

DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
    c1 varchar(255)
);

INSERT INTO t1 (c1) VALUES 
    ('0'),
    ('1'),
    ('+1'),
    ('-1'),
    ('00.00'),
    ('73.45'),
    ('+73.45'),
    ('-73.45'),
    ('.246'),
    ('-.34e7'),
    ('12.e-3'),
    ('1.2e+4'),
    ('a'),
    ('9afc'),
    ('e7'),
    ('+e0'),
    ('Ten'),
    ('5 Dollars');

SELECT * FROM t1;

Das SELECT Anweisung am Ende ergibt dies:

+-----------+
| c1        |
+-----------+
| 0         |
| 1         |
| +1        |
| -1        |
| 00.00     |
| 73.45     |
| +73.45    |
| -73.45    |
| .246      |
| -.34e7    |
| 12.e-3    |
| 1.2e+4    |
| a         |
| 9afc      |
| e7        |
| +e0       |
| Ten       |
| 5 Dollars |
+-----------+

Die Spalte ist ein varchar(255) Spalte, also nicht numerisch. Es kann (und tut) Zahlen enthalten, aber diese werden als Zeichendaten gespeichert. Es kann auch beliebigen Text enthalten (was es auch tut).

Alle nicht-numerischen Werte zurückgeben

Wir können die folgende Abfrage verwenden, um nicht numerische Werte aus der obigen Tabelle zurückzugeben:

SELECT c1
FROM t1 
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

Ergebnis:

+-----------+
| c1        |
+-----------+
| 12.e-3    |
| a         |
| 9afc      |
| Ten       |
| 5 Dollars |
+-----------+

Nicht-Ganzzahlen zurückgeben

Wenn wir nur Nicht-Ganzzahlen zurückgeben wollen, kann die Abfrage viel einfacher sein:

SELECT c1
FROM t1 
WHERE c1 NOT REGEXP '^[0-9]+$';

Ergebnis:

+-----------+
| c1        |
+-----------+
| +1        |
| -1        |
| 00.00     |
| 73.45     |
| +73.45    |
| -73.45    |
| .246      |
| -.34e7    |
| 12.e-3    |
| 1.2e+4    |
| a         |
| 9afc      |
| e7        |
| +e0       |
| Ten       |
| 5 Dollars |
+-----------+

Enthält keine numerischen Daten

Wenn wir nur Zeilen finden möchten, die keine numerischen Daten enthalten, können wir Folgendes tun:

SELECT c1 
FROM t1 
WHERE c1 NOT REGEXP '[0-9]+';

Ergebnis:

+------+
| c1   |
+------+
| a    |
| Ten  |
+------+

Wir können eine POSIX-Klasse verwenden, um dasselbe Ergebnis zu erhalten:

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

Ergebnis:

+------+
| c1   |
+------+
| a    |
| Ten  |
+------+