Определить, является ли значение числом в MySQL

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

SELECT * 
FROM myTable 
WHERE isANumber(col1) = true

Ответ 1

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

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

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

  • 1e4
  • 1.2e5
  • 123. (конечный десятичный знак)

Ответ 2

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

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

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

Ответ 3

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

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

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

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

(В regex, ^ означает начало, а $означает конец)

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

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'

Ответ 4

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

select * from table where col1 REGEXP '^[[:digit:]]+$'

Ответ 5

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 -1 0).

Тестовое задание:

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

демонстрация

Ответ 6

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

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

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

Ответ 7

используйте 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

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

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

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

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

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

Ответ 8

Все еще не хватает этой простой версии:

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

Ответ 9

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

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

SELECT * FROM myTable WHERE col1 > 0;

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

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

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

SELECT * FROM myTable WHERE !col1 > 0;

Ответ 10

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

column*1 = column

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

SELECT * FROM myTable WHERE column * 1 = column;

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

Ответ 11

SELECT * FROM myTable WHERE sign (col1)!=0

ofcourse sign (0) равен нулю, но тогда вы можете ограничить свой запрос...

SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0

ОБНОВЛЕНИЕ: Это не на 100% надежно, потому что "1abc" вернул бы знак 1, но "ab1c" вернул бы ноль... так что это может работать только для текста, который не начинается с цифр.

Ответ 12

вы можете использовать CAST

  SELECT * from tbl where col1 = concat(cast(col1 as decimal), "")

Ответ 13

Я обнаружил, что это работает довольно хорошо

if(col1/col1= 1,'number',col1) AS myInfo

Ответ 14

Попробуйте разделить /1

select if(value/1>0 or value=0,'its a number', 'its not a number') from table