检测MySQL中的值是否为数字

Urb*_*coz 144 mysql sql where-clause

有没有办法检测值是否是MySQL查询中的数字?

例如, __CODE__

T. *_*ner 272

你也可以使用正则表达式...它会像:

SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';
Run Code Online (Sandbox Code Playgroud)

参考: http ://dev.mysql.com/doc/refman/5.1/en/regexp.html

  • SELECT*FROM myTable WHERE col1 REGEXP'^ [0-9] + $'; (69认同)
  • 对于"不匹配"的情况:`WHERE col1 NOT REGEXP ...`,对于可能有小数点的情况,请使用正则表达式:`^ [0-9 \.] + $` (19认同)
  • 接受的答案非常聪明,但这个答案更直接,我认为它应该是公认的解决方案. (6认同)
  • 也不适用于科学记数法,仅适用于整数 (2认同)

Ric*_*iwi 232

这应该适用于大多数情况.

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

它不适用于非标准数字

  • 1e4
  • 1.2e5
  • 123. (尾随小数)

  • 也不适用于诸如`001`之类的前导零 (13认同)

Dmi*_*nko 53

如果您的数据是'test','test0','test1111','111test','111'

要选择数据为简单int的所有记录:

SELECT * 
FROM myTable 
WHERE col1 REGEXP '^[0-9]+$';
Run Code Online (Sandbox Code Playgroud)

结果:'111'

(在正则表达式中,^表示开始,$表示结束)

要选择存在整数或十进制数的所有记录:

SELECT * 
FROM myTable 
WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12
Run Code Online (Sandbox Code Playgroud)

结果:'111'(与上一个示例相同)

最后,要选择存在数字的所有记录,请使用以下命令:

SELECT * 
FROM myTable 
WHERE col1 REGEXP '[0-9]+';
Run Code Online (Sandbox Code Playgroud)

结果:'test0'和'test1111'和'111test'和'111'

  • 不适用于负值.我将修改建议的正则表达式如下:`REGEXP'^ [+\ - ]?[0-9] + \\.?[0-9]*$'` (8认同)

Dev*_*paq 9

这个答案类似于德米特里,但它将允许小数以及正数和负数.

select * from table where col1 REGEXP '^[[:digit:]]+$'
Run Code Online (Sandbox Code Playgroud)


Pau*_*gel 7

SELECT * FROM myTable
WHERE col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$'
Run Code Online (Sandbox Code Playgroud)

也将匹配带符号的小数(如-1.2,+ 0.2,6.,2e9,1.2e-10).

测试:

drop table if exists myTable;
create table myTable (col1 varchar(50));
insert into myTable (col1) 
  values ('00.00'),('+1'),('.123'),('-.23e4'),('12.e-5'),('3.5e+6'),('a'),('e6'),('+e0');

select 
  col1,
  col1 + 0 as casted,
  col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$' as isNumeric
from myTable;
Run Code Online (Sandbox Code Playgroud)

结果:

col1   |  casted | isNumeric
-------|---------|----------
00.00  |       0 |         1
+1     |       1 |         1
.123   |   0.123 |         1
-.23e4 |   -2300 |         1
12.e-5 | 0.00012 |         1
3.5e+6 | 3500000 |         1
a      |       0 |         0
e6     |       0 |         0
+e0    |       0 |         0
Run Code Online (Sandbox Code Playgroud)

  • 完美的!只有真正涵盖所有基础的答案。应该是公认的答案。 (4认同)

Bor*_*ora 6

返回数字行

我通过以下查询找到了解决方案并为我工作:

SELECT * FROM myTable WHERE col1 > 0;
Run Code Online (Sandbox Code Playgroud)

该查询返回仅具有大于零的列的行 col1

返回非数字行

如果要检查非数字列,请尝试使用技巧(!col1 > 0):

SELECT * FROM myTable WHERE !col1 > 0;
Run Code Online (Sandbox Code Playgroud)

  • 这是行不通的,如果您有一个以数字“123abc”开头的字符串,它将在您的数字行语句中返回,而不是在非数字语句中。 (2认同)

小智 5

在我的计算机上看起来比REGEXP更快的另一种选择是

SELECT * FROM myTable WHERE col1*0 != col1;
Run Code Online (Sandbox Code Playgroud)

这将选择col1以数字值开头的所有行.

  • 如果值为零怎么办? (2认同)

Jir*_*iva 5

仍然缺少这个简单的版本:

SELECT * FROM myTable WHERE `col1` + 0 = `col1`
Run Code Online (Sandbox Code Playgroud)

(加法应该比乘法快)

或用于进一步播放的最慢版本:

SELECT *, 
CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC` 
FROM `myTable`
HAVING `IS_NUMERIC` = 1
Run Code Online (Sandbox Code Playgroud)

  • 除非我误解了,否则 MySQL 会将任何字符串转换为 0,因此这不会区分字符串和数字,两者都将返回相同的值。 (3认同)
  • `'a' + 0 = 'a'` 为真 (3认同)

Hug*_*o R 5

使用UDF(用户定义的函数).

CREATE FUNCTION isnumber(inputValue VARCHAR(50))
  RETURNS INT
  BEGIN
    IF (inputValue REGEXP ('^[0-9]+$'))
    THEN
      RETURN 1;
    ELSE
      RETURN 0;
    END IF;
  END;
Run Code Online (Sandbox Code Playgroud)

然后当你查询

select isnumber('383XXXX') 
Run Code Online (Sandbox Code Playgroud)

- 回顾0

select isnumber('38333434') 
Run Code Online (Sandbox Code Playgroud)

- 回顾1

从tablex中选择isnumber(mycol)mycol1,col2,colx; - 将为mycol1列返回1和0

- 你可以增强小数,科学记数法等功能......

使用UDF的优点是您可以在"where子句"比较的左侧或右侧使用它.这在发送到数据库之前大大简化了SQL:

 SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.