sql >> Databasteknik >  >> RDS >> MariaDB

Hitta alla icke-numeriska värden i en kolumn i MariaDB

Om du någonsin stöter på en teckenkolumn som borde vara en numerisk kolumn, finns det alltid en möjlighet att den innehåller icke-numeriska data som du inte känner till.

I MariaDB kan du köra en fråga som följande för att returnera icke-numeriska data från kolumnen.

Exempeldata

Anta att vi skapar en tabell så här:

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 där SELECT uttalande i slutet resulterar i detta:

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

Kolumnen är en varchar(255) kolumn, så den är inte numerisk. Det kan (och innehåller) siffror men dessa lagras som teckendata. Den kan också innehålla godtycklig text (vilket den gör).

Returnera alla icke-numeriska värden

Vi kan använda följande fråga för att returnera icke-numeriska värden från tabellen ovan:

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

Returnera icke-heltal

Om vi ​​bara vill returnera icke-heltal kan frågan vara mycket enklare:

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

Innehåller inte numerisk data

Om vi ​​bara vill hitta rader som inte innehåller några numeriska data kan vi göra följande:

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

Resultat:

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

Vi kan använda en POSIX-klass för att få samma resultat:

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

Resultat:

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

  1. Få namnet på den aktuella funktionen inuti funktionen med plpgsql

  2. PDO fetchAll grupperar nyckel-värdepar i assoc-array

  3. MySQL - Gör ett befintligt fält unikt

  4. MERGE:Uppdatering av käll- och måltabeller som finns på separata servrar