Как проверить, является ли значение целым числом в MySQL?



Я вижу, что в MySQL есть Cast() и Convert() функции для создания целых чисел из значений, но есть ли способ проверить, является ли значение целым числом? Что-то вроде is_int() в PHP-это то, что я ищу.

617   11  

11 ответов:

Я предполагаю, что вы хотите проверить строковое значение. Одним из хороших способов является оператор REGEXP, сопоставляющий строку с регулярным выражением. Просто сделайте

select field from table where field REGEXP '^-?[0-9]+$';

это достаточно быстро. Если ваше поле числовое, просто проверьте на

ceil(field) = field

вместо.

сравнить его с регулярным выражением.

c. f.http://forums.mysql.com/read.php?60,1907, 38488#msg-38488 как указано ниже:

Re: isnumeric () предложение в MySQL??
автор: kevinclark ()
дата: 08 августа 2005 01: 01PM


Я согласен. Вот функция, которую я создал для MySQL 5:

CREATE FUNCTION IsNumeric (sIn varchar(1024)) RETURNS tinyint
RETURN sIn REGEXP '^(-|\+){0,1}([0-9]+\.[0-9]*|[0-9]*\.[0-9]+|[0-9]+)$';


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

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

a41q
1458
xwe8
1475
asde
9582
.
.
.
.
.
qe84

и вы хотите самое высокое числовое значение из этого столбца БД (в данном случае это 9582), то этот запрос поможет вам

SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$'

вот простое решение для него предполагая, что тип данных-varchar

select * from calender where year > 0

он вернет true, если год является числовым else false

Это также работает:

CAST( coulmn_value AS UNSIGNED ) // will return 0 if not numeric string.
SELECT CAST('a123' AS UNSIGNED) // returns 0
SELECT CAST('123' AS UNSIGNED) // returns 123 i.e. > 0

чтобы проверить, является ли значение Int в Mysql, мы можем использовать следующий запрос. Этот запрос даст строки со значениями Int

SELECT col1 FROM table WHERE concat('',col * 1) = col;

о:

WHERE table.field = "0" or CAST(table.field as SIGNED) != 0

для проверки числовых и corrolary:

WHERE table.field != "0" and CAST(table.field as SIGNED) = 0

Я пробовал использовать регулярные выражения, перечисленные выше, но они не работают для следующего:

SELECT '12 INCHES' REGEXP '^(-|\+){0,1}([0-9]+\.[0-9]*|[0-9]*\.[0-9]+|[0-9]+)$' FROM ...

выше вернется 1 (TRUE), что означает проверку строки "12 дюймов" против регулярного выражения выше, возвращает TRUE. Это похоже на число, основанное на регулярном выражении, используемом выше. В этом случае, поскольку 12 находится в начале строки, регулярное выражение интерпретирует его как число.

следующая будет возвращает правильное значение (т. е. 0), поскольку строка начинается с символов вместо цифр

SELECT 'TOP 10' REGEXP '^(-|\+){0,1}([0-9]+\.[0-9]*|[0-9]*\.[0-9]+|[0-9]+)$' FROM ...

выше вернется 0 (FALSE) потому что начало строки является текстовым, а не числовым.

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

лучшее, что я мог придумать для переменной, это int-это комбинация с функциями MySQL CAST() и LENGTH().
Этот метод будет работать со строками, целыми числами, типами данных Double / floats.

SELECT (LENGTH(CAST([data] AS UNSIGNED))) = (LENGTH([data])) AS is_int

смотрите демо http://sqlfiddle.com/#! 9 / ff40cd/44

Это хорошо работает для VARCHAR, где он начинается с числа или нет..

WHERE concat('',fieldname * 1) != fieldname 

могут быть ограничения, когда вы добираетесь до больших NNNNE+ - чисел

для меня единственное что работает это:

CREATE FUNCTION IsNumeric (SIN VARCHAR(1024)) RETURNS TINYINT
RETURN SIN REGEXP '^(-|\+){0,1}([0-9]+\.[0-9]*|[0-9]*\.[0-9]+|[0-9]+)$';

от kevinclark все остальные возвращают бесполезные вещи для меня в случае 234jk456 или 12 inches

Comments

    Ничего не найдено.