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


122

我看到在MySQL中,有Cast()Convert()函数可以从值创建整数,但是有什么方法可以检查值是否是整数?is_int()我正在寻找PHP中类似的东西。


2
那么伤心,我们必须在MySQL创建is_int()函数
裕达Prawira

Answers:


213

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

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

这相当快。如果您的字段是数字,则只需测试

ceil(field) = field

代替。


4
'ceil(field)= field'测试是一个不错的主意,但是正如@Jumpy指出的那样,它在非数字数据上失败:SELECT ceil('four')='four'; -> 1
马修·康奈尔

2
@MatthewCornell,他说,如果您的字段是数字。这样就可以测试数字是否为整数。它不适用于字符串,这就是第一个选项在那里的原因。
Malfist 2013年

如果数据可能包含空格,则将失败。考虑测试trim(field),可能需要一个额外的arg来删除换行符。
Michael Grazebrook,2015年

数据是数字,也可以这样做:select((field%1)= 0);
ThiamTeck '16

谢谢,但是为了进行数值比较,我认为您不需要(strcmp(ceil(field),field))
艾伦·迪克森

14

将其与正则表达式匹配。

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

Re:MySQL中的IsNumeric()子句?
发表者:kevinclark()
Date: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]+)$';


这样可以在开头添加一个可选的正/负号,一个可选的小数点和其余数字。


谢谢,您的解决方案也照顾小数点
Ananda

12

假设我们有一个包含字母数字字段的列,其条目类似于

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

并且您想要此数据库列中的最高数值(在这种情况下为9582),那么此查询将为您提供帮助

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

1
'10000'更高,但您的查询仍将返回'9582'
Paul Spiegel

8

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

select * from calender where year > 0

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


29
在varchar中,如果第一个字符为数字,则也将返回true。
TuK 2012年

没注意到。投票赞成您的评论:)
Jayjitraj 2014年

8

这也适用:

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

11
怎么样SELECT CAST('12a34' AS UNSIGNED),这回报12
Mike C

1
如果您需要测试非数字项目,则此方法非常理想,这值得您多加+1。其他答案很难逆转测试以找到非数字项。
DrCord 2014年

1
@DrCord在Mike C描述的情况下不起作用,因此非常不可靠
jontro

4

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

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

这还将选择非整数(例如'3.5')。
Paul Spiegel

4

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

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

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

如果该列具有单个字符值,它将失败。如果列的值为'A',则Cast('A'为UNSIGNED)的值将为0,而LENGTH(0)将为1。因此LENGTH(Cast('A'为UNSIGNED))= LENGTH(0)的值将为1 = 1 => 1

真正的Waqas Malik完全怀疑这件事。补丁是。

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      |

观看演示


如果该列具有单个字符值,它将失败。如果列的值为'A',则Cast('A'为UNSIGNED)的值将为0,而LENGTH(0)将为1。因此LENGTH(Cast('A'为UNSIGNED))= LENGTH(0)的值将为1 = 1 => 1
Waqas Malik,

感谢您的评论,此案确实未经测试@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

关于什么:

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

测试数字和颜色:

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

1
CAST(table.field)!= 0将不起作用,因为它需要类型转换。
Riad 2013年

如果您需要测试非数字项目,则此方法非常理想,这值得您多加+1。其他答案很难逆转测试以找到非数字项。
DrCord 2014年

这不适用于“ 0000”,“ 0”(空格)和“ 7x”(被认为是数字)之类的数字。
Michael Grazebrook,2015年

@MichaelGrazebrook我想您可以对前两种情况进行正则表达式。“ 7x”被视为数字?“ 0x7”是数字,但是是7x?
Tom Auger

1
@Tom Auger:另一个答案涉及正则表达式类型的解决方案。我的意思是“7X被认为是数字”的是,这个说法是正确的:选择7 =“7Q”
迈克尔Grazebrook

1

我已经尝试使用上面列出的正则表达式,但是它们不适用于以下情况:

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

上面的代码将返回1TRUE),表示针对字符串'12 INCHES'对上面的正则表达式进行测试TRUE。根据上面使用的正则表达式,它看起来像一个数字。在这种情况下,由于12在字符串的开头,因此正则表达式将其解释为数字。

以下内容将返回正确的值(即0),因为字符串以字符而不是数字开头

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

上面的将返回0FALSE),因为字符串的开头是文本而不是数字。

但是,如果要处理包含数字和以数字开头的字母的混合字符串,则不会获得所需的结果。实际上,REGEXP会将字符串解释为有效数字。


2
这是不正确的。你测试了吗?当我运行您的第一个示例时,它会FALSE按预期方式返回,因为正则表达式以$表示字符串的结尾结尾,因此它仅根据作者的意图检查数字。
spikyjt 2014年

1

这对于以数字开头或不以数字开头的VARCHAR都适用。

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

当您使用较大的NNNNE +号时,可能会有限制


这似乎不适用于单个字符字符串set @val = '5'; SELECT @val, concat('', @val * 1) != @val is_int;
spen.smith

0

对我而言,唯一有效的方法是:

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

从kevinclark对我的情况下,所有其他返回无用的东西234jk45612 inches

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.