【问题标题】:How do I check to see if a value is an integer in MySQL?如何在 MySQL 中检查一个值是否为整数?
【发布时间】:2008-09-16 18:56:53
【问题描述】:

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

【问题讨论】:

  • 很遗憾我们必须在 Mysql 中创建 is_int() 函数

标签: mysql


【解决方案1】:

我假设你想检查一个字符串值。一种不错的方法是 REGEXP 运算符,将字符串与正则表达式匹配。干脆做

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

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

ceil(field) = field

改为。

【讨论】:

  • 'ceil(field) = field' 测试是个好主意,但正如@Jumpy 指出的那样,它在非数字数据上失败: SELECT ceil('four') = 'four'; -> 1
  • @MatthewCornell,他说如果你的字段是数字。这样您就可以测试数字是否为整数。它不适用于字符串,这就是第一个选项存在的原因。
  • 如果数据可能包含空格,这将失败。考虑测试 trim(field),可能使用额外的 arg 来删除换行符。
  • 数据是数字的,也可以这样:select ((field % 1) = 0);
  • 谢谢,但是对于数字比较,我认为您不需要(strcmp(ceil(field),field))
【解决方案2】:

将其与正则表达式匹配。

参考http://forums.mysql.com/read.php?60,1907,38488#msg-38488 引用如下:

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


我同意。这是我为 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]+)$';


这允许在开头使用可选的加号/减号、一个可选的小数点和其余数字。

【讨论】:

  • 谢谢,您的解决方案也可以处理小数
【解决方案3】:

假设我们有一列包含字母数字字段的条目,例如

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

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

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

【讨论】:

  • '10000' 更高,但您的查询仍会返回 '9582'
【解决方案4】:

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

select * from calender where year > 0

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

【讨论】:

  • 在 varchar 中,如果第一个字符是数字,这也将返回 true。
  • 没注意到。投票赞成您的评论:)
【解决方案5】:

这也有效:

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

【讨论】:

  • SELECT CAST('12a34' AS UNSIGNED) 怎么样,它返回 12
  • 如果您需要测试非数字项目,这非常适合,这值得更多 +1。其他答案更难逆向测试以找到非数字项目。
  • @DrCord 这不适用于 Mike C 描述的情况,因此非常不可靠
【解决方案6】:

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

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

【讨论】:

  • 这也将选择非整数数字(例如。'3.5')。
【解决方案7】:

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

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

查看演示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

True 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      |

demo

【讨论】:

  • 如果该列具有单个字符值,它将失败。如果列的值为“A”,则 Cast('A' as 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;
  • 这是一个很酷的解决方案。我认为它对负整数失败了,它是否会改变任何实质性(在极端情况下)以将您的解决方案切换为有符号整数?我一直在用你的小提琴作为基础进行测试。 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 的积极和客气话尚未完全测试但尝试使用 ABS() -> db-fiddle.com/f/NNXJ9cPwxjNPz9NknsSGU/3
【解决方案8】:

怎么样:

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

测试数字和推论:

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

【讨论】:

  • CAST(table.field) != 0 不起作用,因为它需要一个类型来转换。
  • 如果您需要测试非数字项目,这非常适合,这值得更多 +1。其他答案更难逆向测试以找到非数字项目。
  • 这不适用于“0000”、“0”(空格)和“7x”(被视为数字)等数字。
  • @MichaelGrazebrook 我想你可以为前两种情况做一个正则表达式。 “7x”被认为是一个数字? “0x7”是一个数字,但7x?
  • @Tom Auger:另一个答案涵盖了正则表达式类型的解决方案。我所说的“7x 被认为是一个数字”的意思是这个陈述是正确的:select 7 = '7q'
【解决方案9】:

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

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

上面会返回1 (TRUE),意思是字符串'12 INCHES'对上面的正则表达式的测试,返回TRUE。它看起来像一个基于上面使用的正则表达式的数字。在这种情况下,因为 12 位于字符串的开头,所以正则表达式将其解释为数字。

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

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

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

但是,如果您处理的字符串混合了数字和以数字开头的字母,您将无法获得想要的结果。 REGEXP 会将字符串解释为有效数字,而实际上它不是。

【讨论】:

  • 这是不正确的。你测试了吗?当我运行您的第一个示例时,它按预期返回 FALSE,因为正则表达式以 $ 结尾,这意味着字符串的结尾,因此它只检查数字,正如作者所期望的那样。
【解决方案10】:

这适用于 VARCHAR,它是否以数字开头..

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

当您获得较大的 NNNNE+- 数字时可能会有限制

【讨论】:

  • 这似乎不适用于单字符字符串set @val = '5'; SELECT @val, concat('', @val * 1) != @val is_int;
【解决方案11】:

对我来说唯一有效的是:

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

234jk45612 inches 的情况下,来自kevinclark 的所有其他东西都会为我返回无用的东西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多