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