sql >> Database >  >> RDS >> MariaDB

Retourneer alleen numerieke waarden in MariaDB

De volgende MariaDB-voorbeelden retourneren alleen die rijen met numerieke waarden in een bepaalde kolom.

Deze voorbeelden gebruiken de REGEXP functie om waarden te retourneren die overeenkomen met het opgegeven patroon.

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'),
    ('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 nu aangemaakt en bevat de volgende gegevens:

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

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 numerieke waarden retourneren

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

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

Resultaat:

+--------+
| c1     |
+--------+
| 0      |
| 1      |
| +1     |
| -1     |
| 00.00  |
| 73.45  |
| +73.45 |
| -73.45 |
| .246   |
| -.34e7 |
| 1.2e+4 |
| e7     |
| +e0    |
+--------+

Gehele getallen retourneren

Als we alleen gehele getallen willen retourneren, kan de query een stuk eenvoudiger zijn:

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

Resultaat:

+------+
| c1   |
+------+
| 0    |
| 1    |
+------+

Bevat numerieke gegevens

Als we rijen willen vinden die alleen bevatten numerieke gegevens (zelfs als ze ook niet-numerieke gegevens bevatten), kunnen we het volgende doen:

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

Resultaat:

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

POSIX-tekenklassen

MariaDB ondersteunt POSIX-tekenklassen, wat betekent dat we [:digit:] . kunnen gebruiken in plaats van [0-9] in onze reguliere expressies.

Voorbeeld:

SELECT c1
FROM t1 
WHERE c1 REGEXP '^[[:digit:]]?$';

Resultaat:

+------+
| c1   |
+------+
| 0    |
| 1    |
+------+

  1. Fix "ERROR 1250 (42000):Tabel '...' van een van de SELECT's kan niet worden gebruikt in de globale ORDER-clausule" bij gebruik van UNION in MySQL

  2. Configuratieparameter work_mem in PostgreSQL op Linux

  3. Verschil tussen numeriek, zwevend en decimaal in SQL Server

  4. Het compatibiliteitsniveau van een database wijzigen met T-SQL