sql >> Database >  >> RDS >> Mysql

Hoe vindt u niet-numerieke waarden in een kolom in MySQL

In MySQL kunt u een query als de volgende uitvoeren om niet-numerieke gegevens uit de kolom te retourneren.

Dit kan handig zijn als u ooit een kolom vindt die numerieke gegevens bevat, maar die is ingesteld als een varchar of char kolom. U kunt deze query gebruiken om niet-numerieke waarden te vinden die mogelijk in de kolom zijn ingevoegd. U kunt er vervolgens mee omgaan zoals u wilt, zoals ze naar numeriek converteren en vervolgens het kolomtype wijzigen.

Voorbeeldgegevens

Stel dat we een tabel als volgt maken:

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

INSERT INTO t1 (c1) VALUES 
    ('0'),
    ('1'),
    ('+1'),
    ('-1'),
    ('.5'),
    ('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;

De tabel is gemaakt en bevat de volgende rijen:

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

De kolom is een varchar(255) kolom, dus het is niet numeriek. Het kan (en zal) cijfers bevatten, maar deze worden opgeslagen als tekengegevens. Het kan ook willekeurige tekst bevatten (wat het ook doet).

Alle niet-numerieke waarden retourneren

We kunnen de volgende query gebruiken om niet-numerieke waarden uit de bovenstaande tabel te retourneren:

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

Resultaat:

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

Niet-gehele getallen retourneren

Als we alleen niet-gehele getallen willen retourneren, kan de zoekopdracht een stuk eenvoudiger zijn:

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

Resultaat:

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

Bevat geen numerieke gegevens

Als we alleen rijen willen vinden die geen numerieke gegevens bevatten, kunnen we het volgende doen:

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

Resultaat:

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

  1. MySQL INT betekenis

  2. Selecteer en bewerk verticale blokken in SQL Server Management Studio (SSMS) - SQL Server / TSQL-zelfstudie, deel 9

  3. Exporteer tabel naar bestand met kolomkoppen (kolomnamen) met behulp van het bcp-hulpprogramma en SQL Server 2008

  4. Hoe de databasenauwkeurigheid te verbeteren