Определить, является ли значение числом в MySQL - PullRequest
133 голосов
/ 21 февраля 2011

Есть ли способ определить, является ли значение числом в запросе MySQL?Такие как

SELECT * 
FROM myTable 
WHERE isANumber(col1) = true

Ответы [ 14 ]

251 голосов
/ 23 декабря 2011

Вы также можете использовать регулярные выражения ... это будет выглядеть так:

SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';

Справка: http://dev.mysql.com/doc/refman/5.1/en/regexp.html

217 голосов
/ 21 февраля 2011

Это должно работать в большинстве случаев.

SELECT * FROM myTable WHERE concat('',col1 * 1) = col1

Это не работает для нестандартных чисел, таких как

  • 1e4
  • 1.2e5
  • 123. (конечный десятичный знак)
50 голосов
/ 22 марта 2013

Если ваши данные «test», «test0», «test1111», «111test», «111»

Чтобы выбрать все записи, где данные являются простыми int:

SELECT * 
FROM myTable 
WHERE col1 REGEXP '^[0-9]+$';

Результат: '111'

(в регулярном выражении ^ означает начало, а $ означает конец)

Чтобы выбрать все записи, в которых существует целое или десятичное число:

SELECT * 
FROM myTable 
WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12

Результат: '111' (аналогично последнему примеру)

Наконец, , чтобы выбрать все записи, где существует номер, используйте это:

SELECT * 
FROM myTable 
WHERE col1 REGEXP '[0-9]+';

Результат: «test0» и «test1111» и «111test» и «111»

8 голосов
/ 17 февраля 2015

Этот ответ похож на Дмитрия, но он допускает десятичные, а также положительные и отрицательные числа.

select * from table where col1 REGEXP '^[[:digit:]]+$'
6 голосов
/ 14 февраля 2018
SELECT * FROM myTable
WHERE col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$'

Будет также соответствовать десятичным знакам со знаком (например, -1.2, +0.2, 6., 2e9, 1.2e-10 ).

Тест:

drop table if exists myTable;
create table myTable (col1 varchar(50));
insert into myTable (col1) 
  values ('00.00'),('+1'),('.123'),('-.23e4'),('12.e-5'),('3.5e+6'),('a'),('e6'),('+e0');

select 
  col1,
  col1 + 0 as casted,
  col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$' as isNumeric
from myTable;

Результат:

col1   |  casted | isNumeric
-------|---------|----------
00.00  |       0 |         1
+1     |       1 |         1
.123   |   0.123 |         1
-.23e4 |   -2300 |         1
12.e-5 | 0.00012 |         1
3.5e+6 | 3500000 |         1
a      |       0 |         0
e6     |       0 |         0
+e0    |       0 |         0

Демо

5 голосов
/ 03 августа 2017

использовать UDF (пользовательская функция).

CREATE FUNCTION isnumber(inputValue VARCHAR(50))
  RETURNS INT
  BEGIN
    IF (inputValue REGEXP ('^[0-9]+$'))
    THEN
      RETURN 1;
    ELSE
      RETURN 0;
    END IF;
  END;

Затем при запросе

select isnumber('383XXXX') 

- возвращает 0

select isnumber('38333434') 

- возвращает1

выберите из таблицы x isnumber (mycol) mycol1, col2, colx;- вернет 1 и 0 для столбца mycol1

- вы можете усовершенствовать функцию, чтобы принимать десятичные дроби, научные записи и т. д. *

Преимущество использования UDF заключается в том, что вы можетеиспользуйте его с левой или правой стороны сравнения «условия предложения».это значительно упрощает ваш SQL перед отправкой в ​​базу данных:

 SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');

надеюсь, это поможет.

5 голосов
/ 31 октября 2014

Другая альтернатива, которая на моем компьютере выглядит быстрее, чем REGEXP, -

SELECT * FROM myTable WHERE col1*0 != col1;

Это выберет все строки, в которых столбец col1 начинается с числового значения.

4 голосов
/ 08 ноября 2018

Возвращает числовые строки

Я нашел решение с помощью следующего запроса и работает для меня:

SELECT * FROM myTable WHERE col1 > 0;

Этот запрос возвращает строки, имеющие только столбец с номерами, превышающими ноль, которые col1

Возвращает нечисловые строки

если вы хотите проверить столбец не числовым, попробуйте этот трюк (!col1 > 0):

SELECT * FROM myTable WHERE !col1 > 0;
4 голосов
/ 11 января 2017

По-прежнему отсутствует эта простая версия:

SELECT * FROM myTable WHERE `col1` + 0 = `col1`

(сложение должно быть быстрее при умножении)

Или самая медленная версия для дальнейшей игры:

SELECT *, 
CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC` 
FROM `myTable`
HAVING `IS_NUMERIC` = 1
3 голосов
/ 25 февраля 2016

Рекомендую: если ваш поиск прост, вы можете использовать `

column*1 = column

` Оператор интереса :) работает и быстрее, чем на полях varchar / char

SELECT* FROM myTable WHERE * 1 = столбец;

ABC*1 => 0 (NOT EQU **ABC**)
AB15*A => 15 (NOT EQU **AB15**)
15AB => 15 (NOT EQU **15AB**)
15 => 15 (EQUALS TRUE **15**)
...