Как проверить, является ли значение целым числом в MySQL? - PullRequest
105 голосов
/ 16 сентября 2008

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

Ответы [ 11 ]

189 голосов
/ 16 сентября 2008

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

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

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

ceil(field) = field

вместо.

13 голосов
/ 16 сентября 2008

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

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

Re: IsNumeric () предложение в MySQL ??
Автор: kevinclark ()
Дата: 8 августа 2005 г., 01:01 вечера * 1008


Я согласен. Вот функция, которую я создал для 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]+)$';


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

10 голосов
/ 25 сентября 2012

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

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

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

SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$'
8 голосов
/ 09 марта 2011

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

select * from calender where year > 0

Он вернет true, если год числовой, иначе false

6 голосов
/ 24 декабря 2013

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

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
4 голосов
/ 29 июля 2015

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

SELECT col1 FROM table WHERE concat('',col * 1) = col;
3 голосов
/ 27 июля 2012

А как же:

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

для проверки числовых и следственных значений:

WHERE table.field != "0" and CAST(table.field as SIGNED) = 0
2 голосов
/ 18 апреля 2018

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

SELECT (LENGTH(CAST(<data> AS UNSIGNED))) = (LENGTH(<data>)) AS is_int

см. Демонстрацию http://sqlfiddle.com/#!9/ff40cd/44

произойдет сбой, если столбец имеет однозначное значение. если столбец имеет значение 'A' затем Cast ('A' как UNSIGNED) будет иметь значение 0 и ДЛИНА (0) будет 1. поэтому ДЛИНА (приведение («A» как неподписанный)) = ДЛИНА (0) будет оценить до 1 = 1 => 1

Правда Вакас Малик совершенно не готов испытать это дело. патч есть.

SELECT <data>, (LENGTH(CAST(<data> AS UNSIGNED))) = CASE WHEN CAST(<data> AS UNSIGNED) = 0 THEN CAST(<data> AS UNSIGNED) ELSE (LENGTH(<data>)) END AS is_int;

Результаты

**Query #1**

    SELECT 1, (LENGTH(CAST(1 AS UNSIGNED))) = CASE WHEN CAST(1 AS UNSIGNED) = 0 THEN CAST(1 AS UNSIGNED) ELSE (LENGTH(1)) END AS is_int;

| 1   | is_int |
| --- | ------ |
| 1   | 1      |

---
**Query #2**

    SELECT 1.1, (LENGTH(CAST(1 AS UNSIGNED))) = CASE WHEN CAST(1.1 AS UNSIGNED) = 0 THEN CAST(1.1 AS UNSIGNED) ELSE (LENGTH(1.1)) END AS is_int;

| 1.1 | is_int |
| --- | ------ |
| 1.1 | 0      |

---
**Query #3**

    SELECT "1", (LENGTH(CAST("1" AS UNSIGNED))) = CASE WHEN CAST("1" AS UNSIGNED) = 0 THEN CAST("1" AS UNSIGNED) ELSE (LENGTH("1")) END AS is_int;

| 1   | is_int |
| --- | ------ |
| 1   | 1      |

---
**Query #4**

    SELECT "1.1", (LENGTH(CAST("1.1" AS UNSIGNED))) = CASE WHEN CAST("1.1" AS UNSIGNED) = 0 THEN CAST("1.1" AS UNSIGNED) ELSE (LENGTH("1.1")) END AS is_int;

| 1.1 | is_int |
| --- | ------ |
| 1.1 | 0      |

---
**Query #5**

    SELECT "1a", (LENGTH(CAST("1.1" AS UNSIGNED))) = CASE WHEN CAST("1a" AS UNSIGNED) = 0 THEN CAST("1a" AS UNSIGNED) ELSE (LENGTH("1a")) END AS is_int;

| 1a  | is_int |
| --- | ------ |
| 1a  | 0      |

---
**Query #6**

    SELECT "1.1a", (LENGTH(CAST("1.1a" AS UNSIGNED))) = CASE WHEN CAST("1.1a" AS UNSIGNED) = 0 THEN CAST("1.1a" AS UNSIGNED) ELSE (LENGTH("1.1a")) END AS is_int;

| 1.1a | is_int |
| ---- | ------ |
| 1.1a | 0      |

---
**Query #7**

    SELECT "a1", (LENGTH(CAST("1.1a" AS UNSIGNED))) = CASE WHEN CAST("a1" AS UNSIGNED) = 0 THEN CAST("a1" AS UNSIGNED) ELSE (LENGTH("a1")) END AS is_int;

| a1  | is_int |
| --- | ------ |
| a1  | 0      |

---
**Query #8**

    SELECT "a1.1", (LENGTH(CAST("a1.1" AS UNSIGNED))) = CASE WHEN CAST("a1.1" AS UNSIGNED) = 0 THEN CAST("a1.1" AS UNSIGNED) ELSE (LENGTH("a1.1")) END AS is_int;

| a1.1 | is_int |
| ---- | ------ |
| a1.1 | 0      |

---
**Query #9**

    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;

| a   | is_int |
| --- | ------ |
| a   | 0      |

см. демо

2 голосов
/ 17 мая 2012

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

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), потому что начало строки текстовое, а не числовое.

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

0 голосов
/ 25 января 2017

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...