Mysql
 sql >> база данни >  >> RDS >> Mysql

Връща само числови стойности в MySQL

Следната MySQL заявка връща само онези редове, които имат числови стойности в дадена колона.

Примерни данни

Да предположим, че създаваме таблица като тази:

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;

Таблицата вече е създадена и съдържа следните данни:

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

Колоната е varchar(255) колона, така че не е числова. Може (и съдържа) числа, но те се съхраняват като данни за знаци. Може също да съдържа произволен текст (което прави).

Връщане на всички числови стойности

Можем да използваме следната заявка, за да върнем всички числови стойности от горната таблица:

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

Резултат:

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

Тук използвахме REGEXP функция, за да съвпада само със стойностите, които съответстват на нашия определен модел.

Връщане на цели числа

Ако искаме да върнем само цели числа, моделът може да бъде много по-прост:

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

Резултат:

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

Съдържа числови данни

Ако искаме да намерим редове, които само съдържат числови данни (дори и те да съдържат нечислови данни), можем да направим следното:

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

Резултат:

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

MySQL поддържа POSIX символни класове, което означава, че можем да използваме [:digit:] вместо [0-9] в нашите регулярни изрази.

Пример:

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

Което е еквивалентно на следното:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel 5.4 на PHP 7.0:PDO изключение - не можа да се намери драйвер (MySQL)

  2. 5 MySql полезни заявки по време на разработката на проекта

  3. Грешка при използване освен в заявка

  4. Може ли MySQL тригер да симулира ограничение CHECK?

  5. Как да инсталирате MySQL 8 на Ubuntu