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

Find alle ikke-numeriske værdier i en kolonne i MariaDB

Hvis du nogensinde støder på en tegnkolonne, der burde være en numerisk kolonne, er der altid en mulighed for, at den indeholder ikke-numeriske data, som du ikke kender til.

I MariaDB kan du køre en forespørgsel som følgende for at returnere ikke-numeriske data fra kolonnen.

Eksempeldata

Antag, at vi opretter en tabel som denne:

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;

Den SELECT sætning i slutningen resulterer i dette:

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

Kolonnen er en varchar(255) kolonne, så den er ikke numerisk. Det kan (og gør) indeholde tal, men disse gemmes som tegndata. Den kan også indeholde vilkårlig tekst (hvilket den gør).

Returner alle ikke-numeriske værdier

Vi kan bruge følgende forespørgsel til at returnere ikke-numeriske værdier fra ovenstående tabel:

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

Resultat:

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

Return ikke-heltal

Hvis vi kun ønsker at returnere ikke-heltal, kan forespørgslen være meget enklere:

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

Resultat:

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

Indeholder ikke numeriske data

Hvis vi blot ønsker at finde rækker, der ikke indeholder nogen numeriske data, kan vi gøre følgende:

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

Resultat:

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

Vi kan bruge en POSIX-klasse til at få det samme resultat:

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

Resultat:

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

  1. Kører PostgreSQL langsomt? Tips og tricks til at komme til kilden

  2. Tabellen muterer, trigger/funktion ser den muligvis ikke (hvilket forhindrer en gennemsnitskarakter i at falde til under 2,5)

  3. Gendan dump på fjernmaskinen

  4. IllegalStateException:database allerede lukket (ved hjælp af ViewPager)