Как мне проверить, является ли значение целым числом в MySQL?
124
Я вижу , что в MySQL есть Cast()и Convert()функция для создания целых чисел из значений, но есть ли способ , чтобы проверить, если значение является целым числом? Что-то вроде is_int()PHP - вот что я ищу.
так что, к сожалению, мы должны создать функцию is_int () в Mysql
Юда Правира
Ответы:
216
Я предполагаю, что вы хотите проверить строковое значение. Один из хороших способов - это оператор REGEXP, сопоставляющий строку с регулярным выражением. Просто делай
select field fromtablewhere field REGEXP '^-?[0-9]+$';
это достаточно быстро. Если ваше поле числовое, просто проверьте
Тест 'ceil (field) = field' - хорошая идея, но, как указал @Jumpy, он не работает с нечисловыми данными: SELECT ceil ('four') = 'four'; -> 1
Мэтью Корнелл
3
@MatthewCornell, Он сказал, если ваше поле числовое. Таким образом, вы можете проверить, является ли число целым. На струнах он не работает, поэтому есть первый вариант.
Malfist
Если данные могут включать пробелы, это не сработает. Рассмотрите возможность тестирования trim (field), возможно, с дополнительным аргументом для удаления новой строки.
Майкл Грейзбрук,
если данные числовые, тоже можно: select ((field% 1) = 0);
ThiamTeck
Спасибо, но для числового сравнения, я думаю, вам не нужно (strcmp (ceil (field), field))
как насчет того SELECT CAST('12a34' AS UNSIGNED), что возвращается 12?
Mike C
1
Это отлично работает, если вам нужно проверить нечисловые элементы, это заслуживает большего количества +1. Другие ответы сложнее отменить тест, чтобы найти нечисловые элементы.
DrCord 06
1
@DrCord, это не работает в случае, описанном Майком С, следовательно, очень ненадежно
jontro
4
Чтобы проверить, является ли значение Int в Mysql, мы можем использовать следующий запрос. Этот запрос выдаст строки со значениями Int
Это также выберет нецелые числа (например, «3,5» ).
Пол Шпигель
4
Лучшее, что я мог придумать для переменной, - это int. Это комбинация функций MySQL CAST()и LENGTH().
Этот метод будет работать со строками, целыми числами, типами данных double / float.
он завершится неудачно, если в столбце будет однозначное значение. если столбец имеет значение 'A', тогда Cast ('A' как UNSIGNED) будет оцениваться как 0, а LENGTH (0) будет равно 1. поэтому LENGTH (Cast ('A' as UNSIGNED)) = LENGTH (0) будет оцениваться как 1 = 1 => 1
Истинный Вакас Малик совершенно не хочет проверить этот случай. патч есть.
он завершится неудачно, если в столбце будет однозначное значение. если столбец имеет значение 'A', тогда Cast ('A' как UNSIGNED) будет оцениваться как 0, а LENGTH (0) будет равно 1. поэтому LENGTH (Cast ('A' as UNSIGNED)) = LENGTH (0) будет оцениваться как 1 = 1 => 1
Вакас Малик
Спасибо за комментарий, этот случай действительно не был протестирован @WaqasMalik работает и тестирует патч прямо сейчас .. что-то вродеSELECT "a", (LENGTH(CAST("a" AS UNSIGNED))) = CASE WHEN CAST("a" AS UNSIGNED) = 0 THEN CAST("a" AS UNSIGNED) ELSE (LENGTH("a")) END AS is_int;
Raymond Nijland
Это такое классное решение. Я думаю, что это не работает для отрицательных целых чисел, меняет ли это что-нибудь существенное (в крайних случаях), чтобы переключить ваше решение на целые числа со знаком? Я тестировал вашу скрипку как основу. set @val = '1.'; SELECT @val, LENGTH(CAST(@val AS SIGNED)) = IF(CAST(@val AS SIGNED) = 0, CAST(@val AS SIGNED), LENGTH(@val)) AS is_int;Этот рефакторинг обрабатывает все вышеупомянутые случаи, но даже моя настройка не обрабатывает -1,0 или «-1». Опять же, супер крутое решение.
spen.smith
3
Что о:
WHEREtable.field ="0"or CAST(table.field as SIGNED)!=0
для проверки числовых значений и соответствий:
WHEREtable.field !="0"and CAST(table.field as SIGNED)=0
CAST (table.field)! = 0 не будет работать, так как ему требуется тип для приведения.
Riad
Это отлично работает, если вам нужно проверить нечисловые элементы, это заслуживает большего количества +1. Другие ответы сложнее отменить тест, чтобы найти нечисловые элементы.
DrCord 06
Это не работает для таких чисел, как «0000», «0» (пробел) и «7x» (которое считается числом).
Майкл Грейзбрук,
@MichaelGrazebrook Я полагаю, вы могли бы сделать регулярное выражение для первых двух случаев. «7x» считается числом? «0x7» - это число, а 7x?
Tom Auger
1
@Tom Auger: Другой ответ касался решений типа регулярных выражений. Под «7x считается числом» я имел в виду то, что это утверждение верно: select 7 = '7q'
Майкл Грейзбрук
1
Я пробовал использовать перечисленные выше регулярные выражения, но они не работают в следующих случаях:
Вышеупомянутое будет return 1( TRUE), что означает, что проверка строки «12 ДЮЙМОВ» против регулярного выражения выше, возвращается TRUE. Это похоже на число, основанное на использованном выше регулярном выражении. В этом случае, поскольку 12 находится в начале строки, регулярное выражение интерпретирует его как число.
Следующее вернет правильное значение (т.е. 0), потому что строка начинается с символов вместо цифр.
Вышеупомянутое будет return 0( FALSE), потому что начало строки - текст, а не число.
Однако, если вы имеете дело со строками, которые содержат сочетание цифр и букв, начинающихся с числа, вы не получите желаемых результатов. REGEXP интерпретирует строку как действительное число, хотя на самом деле это не так.
Это неверно. Вы это тестировали? Когда я запускаю ваш первый пример, он возвращается FALSE, как и ожидалось, потому что регулярное выражение заканчивается, $что означает конец строки, поэтому он проверяет только числа, как задумано автором.
spikyjt
1
Это хорошо работает для VARCHAR, где он начинается с числа или нет ..
WHERE concat('',fieldname *1)!= fieldname
могут иметь ограничения при переходе к большим номерам NNNNE +
Ответы:
Я предполагаю, что вы хотите проверить строковое значение. Один из хороших способов - это оператор REGEXP, сопоставляющий строку с регулярным выражением. Просто делай
это достаточно быстро. Если ваше поле числовое, просто проверьте
вместо.
источник
Сопоставьте его с регулярным выражением.
cf http://forums.mysql.com/read.php?60,1907,38488#msg-38488, как указано ниже:
источник
Предположим, у нас есть столбец с буквенно-цифровым полем, в котором есть записи типа
и вам нужно наивысшее числовое значение из этого столбца db (в данном случае это 9582), тогда этот запрос поможет вам
источник
Вот простое решение, предполагающее, что тип данных - varchar
Он вернет true, если год числовой, иначе false
источник
Это тоже работает:
например
источник
SELECT CAST('12a34' AS UNSIGNED)
, что возвращается12
?Чтобы проверить, является ли значение Int в Mysql, мы можем использовать следующий запрос. Этот запрос выдаст строки со значениями Int
источник
Лучшее, что я мог придумать для переменной, - это int. Это комбинация функций MySQL
CAST()
иLENGTH()
.Этот метод будет работать со строками, целыми числами, типами данных double / float.
см. демонстрацию http://sqlfiddle.com/#!9/ff40cd/44
Истинный Вакас Малик совершенно не хочет проверить этот случай. патч есть.
Полученные результаты
см. демонстрацию
источник
SELECT "a", (LENGTH(CAST("a" AS UNSIGNED))) = CASE WHEN CAST("a" AS UNSIGNED) = 0 THEN CAST("a" AS UNSIGNED) ELSE (LENGTH("a")) END AS is_int;
set @val = '1.'; SELECT @val, LENGTH(CAST(@val AS SIGNED)) = IF(CAST(@val AS SIGNED) = 0, CAST(@val AS SIGNED), LENGTH(@val)) AS is_int;
Этот рефакторинг обрабатывает все вышеупомянутые случаи, но даже моя настройка не обрабатывает -1,0 или «-1». Опять же, супер крутое решение.Что о:
для проверки числовых значений и соответствий:
источник
Я пробовал использовать перечисленные выше регулярные выражения, но они не работают в следующих случаях:
Вышеупомянутое будет return
1
(TRUE
), что означает, что проверка строки «12 ДЮЙМОВ» против регулярного выражения выше, возвращаетсяTRUE
. Это похоже на число, основанное на использованном выше регулярном выражении. В этом случае, поскольку 12 находится в начале строки, регулярное выражение интерпретирует его как число.Следующее вернет правильное значение (т.е.
0
), потому что строка начинается с символов вместо цифр.Вышеупомянутое будет return
0
(FALSE
), потому что начало строки - текст, а не число.Однако, если вы имеете дело со строками, которые содержат сочетание цифр и букв, начинающихся с числа, вы не получите желаемых результатов. REGEXP интерпретирует строку как действительное число, хотя на самом деле это не так.
источник
FALSE
, как и ожидалось, потому что регулярное выражение заканчивается,$
что означает конец строки, поэтому он проверяет только числа, как задумано автором.Это хорошо работает для VARCHAR, где он начинается с числа или нет ..
могут иметь ограничения при переходе к большим номерам NNNNE +
источник
set @val = '5'; SELECT @val, concat('', @val * 1) != @val is_int;
для меня единственное, что работает:
от kevinclark все остальные возвращают бесполезные вещи для меня в случае
234jk456
или12 inches
источник