如何检查MySQL中的值是否为整数?

Cra*_*oto 112 mysql

我在MySQL中看到有Cast()Convert()函数从值创建整数,但有没有办法检查一个值是否为整数?is_int()我正在寻找像PHP这样的东西.

小智 198

我假设您要检查字符串值.一个很好的方法是REGEXP运算符,将字符串与正则表达式匹配.简单地做

select field from table where field REGEXP '^-?[0-9]+$';
Run Code Online (Sandbox Code Playgroud)

这个速度相当快.如果您的字段是数字,只需测试

ceil(field) = field
Run Code Online (Sandbox Code Playgroud)

代替.

  • 'ceil(field)= field'测试是一个不错的主意,但正如@Jumpy指出的那样,它在非数字数据上失败:SELECT ceil('four')='four'; - > 1 (4认同)
  • @MatthewCornell,他说如果你的领域是数字.这样你可以测试一个数字是否是一个整数.它不适用于字符串,这就是第一个选项存在的原因. (2认同)

JBB*_*JBB 13

将其与正则表达式匹配.

参见http://forums.mysql.com/read.php?60,1907,38488#msg-38488,如下所述:

Re:MySQL中的IsNumeric()子句?
发布者:kevinclark()
日期:2005年8月8日01:01 PM


我同意.这是我为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]+)$';
Run Code Online (Sandbox Code Playgroud)


这允许在开头有一个可选的加号/减号,一个可选的小数点和其余的数字.


小智 10

假设我们的字段包含字母数字字段,其中包含条目

a41q
1458
xwe8
1475
asde
9582
.
.
.
.
.
qe84
Run Code Online (Sandbox Code Playgroud)

并且您希望此db列中的最高数值(在本例中为9582),那么此查询将帮助您

SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$'
Run Code Online (Sandbox Code Playgroud)


Jay*_*raj 8

假设数据类型为varchar,这是一个简单的解决方案

select * from calender where year > 0
Run Code Online (Sandbox Code Playgroud)

如果年份为数字,则返回true,否则返回false

  • 在varchar中,如果第一个字符是数字,则它也将返回true. (29认同)

Ria*_*iad 6

这也有效:

CAST( coulmn_value AS UNSIGNED ) // will return 0 if not numeric string.
Run Code Online (Sandbox Code Playgroud)

例如

SELECT CAST('a123' AS UNSIGNED) // returns 0
SELECT CAST('123' AS UNSIGNED) // returns 123 i.e. > 0
Run Code Online (Sandbox Code Playgroud)

  • 怎么样`SELECT CAST('12a34'AS UNSIGNED)`,返回`12`? (9认同)

min*_*s23 5

要检查 Mysql 中的值是否为 Int,我们可以使用以下查询。此查询将提供具有 Int 值的行

SELECT col1 FROM table WHERE concat('',col * 1) = col;
Run Code Online (Sandbox Code Playgroud)


Ray*_*and 5

CAST()我能想到的最好的变量是 int ,它是 MySQL 函数和 的组合LENGTH()
此方法适用于字符串、整数、双精度/浮点数据类型。

SELECT (LENGTH(CAST(<data> AS UNSIGNED))) = (LENGTH(<data>)) AS is_int
Run Code Online (Sandbox Code Playgroud)

请参阅演示http://sqlfiddle.com/#!9/ff40cd/44

如果该列只有单个字符值,它将失败。如果列的值为“A”,则 Cast('A' as UNSIGNED) 将计算为 0,LENGTH(0) 将计算为 1。因此 LENGTH(Cast('A' as UNSIGNED))=LENGTH(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;
Run Code Online (Sandbox Code Playgroud)

结果

**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      |
Run Code Online (Sandbox Code Playgroud)

演示