sql >> Databasteknik >  >> RDS >> Mysql

Returnera endast numeriska värden i MySQL

Följande MySQL-fråga returnerar endast de rader som har numeriska värden i en given kolumn.

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;

Tabellen har nu skapats och innehåller följande data:

+-----------+
| 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 numeriska värden

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

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

Resultat:

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

Här använde vi REGEXP funktion för att endast matcha de värden som matchar vårt angivna mönster.

Returnera heltal

Om vi ​​bara vill returnera heltal kan mönstret vara mycket enklare:

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

Resultat:

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

Innehåller numeriska data

Om vi ​​vill hitta rader som bara innehåller numeriska data (även om de också innehåller icke-numeriska data), kan vi göra följande:

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

Resultat:

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

MySQL stöder POSIX-teckenklasser, vilket innebär att vi kan använda [:digit:] istället för [0-9] i våra reguljära uttryck.

Exempel:

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

Vilket motsvarar följande:

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

  1. De 10 bästa anledningarna till att använda Access och Excel tillsammans

  2. Inget sådant kolumn sqlite undantag

  3. Hur man övervakar PostgreSQL som körs inuti en Docker-behållare:Del ett

  4. SQL Natural Join