MariaDB
 sql >> Database >  >> RDS >> MariaDB

Trova tutti i valori non numerici in una colonna in MariaDB

Se mai incontri una colonna di caratteri che dovrebbe essere una colonna numerica, c'è sempre la possibilità che contenga dati non numerici di cui non sei a conoscenza.

In MariaDB, puoi eseguire una query come la seguente per restituire dati non numerici dalla colonna.

Dati campione

Supponiamo di creare una tabella come questa:

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;

Quel SELECT istruzione alla fine risulta in questo:

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

La colonna è un varchar(255) colonna, quindi non è numerico. Può (e lo fa) contenere numeri, ma questi vengono memorizzati come dati di caratteri. Può anche contenere testo arbitrario (cosa che fa).

Restituisci tutti i valori non numerici

Possiamo utilizzare la seguente query per restituire valori non numerici dalla tabella precedente:

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

Risultato:

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

Restituisce non interi

Se vogliamo restituire solo numeri non interi, la query può essere molto più semplice:

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

Risultato:

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

Non contiene dati numerici

Se vogliamo solo trovare righe che non contengono dati numerici, possiamo fare quanto segue:

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

Risultato:

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

Possiamo usare una classe POSIX per ottenere lo stesso risultato:

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

Risultato:

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