sql >> Databáze >  >> RDS >> Mysql

Vracet pouze číselné hodnoty v MySQL

Následující dotaz MySQL vrátí pouze ty řádky, které mají v daném sloupci číselné hodnoty.

Ukázková data

Předpokládejme, že vytvoříme tabulku takto:

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;

Tabulka byla nyní vytvořena a obsahuje následující údaje:

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

Sloupec je varchar(255) sloupec, takže není číselný. Může (a obsahuje) čísla, ale ty jsou uloženy jako znaková data. Může také obsahovat libovolný text (což obsahuje).

Vrátit všechny číselné hodnoty

K vrácení všech číselných hodnot z výše uvedené tabulky můžeme použít následující dotaz:

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

Výsledek:

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

Zde jsme použili REGEXP funkce, aby odpovídala pouze hodnotám, které odpovídají našemu zadanému vzoru.

Vrátit celá čísla

Pokud chceme vrátit pouze celá čísla, vzor může být mnohem jednodušší:

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

Výsledek:

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

Obsahuje číselná data

Pokud chceme najít řádky, které pouze obsahují číselné údaje (i když obsahují i ​​nečíselné údaje), můžeme provést následující:

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

Výsledek:

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

Třídy znaků POSIX

MySQL podporuje znakové třídy POSIX, což znamená, že můžeme použít [:digit:] místo [0-9] v našich regulárních výrazech.

Příklad:

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

Což je ekvivalent následujícího:

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

  1. Úprava plánu agenta SQL Server (T-SQL)

  2. Jak mohu pracovat s vysoce přesnými desetinnými místy v PHP

  3. Řešení pro INSERT OR UPDATE na SQL Server

  4. MyBatis RowBounds neomezuje výsledky dotazů