在MySQL中检测值是否是数字

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

例如, SELECT * FROM myTable WHERE isANumber(col1)=true

这应该在大多数情况下工作。

 SELECT * FROM myTable WHERE concat('',col1 * 1) = col1 

它不适用于非标准的数字

  • 1e4
  • 1.2e5
  • 123. (十进制)

您也可以使用正则expression式…它会是这样的:

 SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$'; 

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

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

要select数据是简单的int的所有logging:

 SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$'; 

结果:'111'

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

要select存在整数或十进制数字的所有logging:

 SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12 

结果:“111”(与上一个例子相同)

最后,要select号码存在的所有logging,请使用以下命令:

 SELECT * FROM myTable WHERE col1 REGEXP '[0-9]+'; 

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

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

 select * from table where col1 REGEXP '^[[:digit:]]+$' 

另一种比我的电脑上的REGEXP更快的方法是

 SELECT * FROM myTable WHERE col1*0 != col1; 

这将selectcol1以数字值开始的所有行。

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

 SELECT * FROM myTable WHERE `col1` + 0 = `col1` 

(加法应该比乘法更快)

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

 SELECT *, CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC` FROM `myTable` HAVING `IS_NUMERIC` = 1 

我build议:如果你的search很简单,你可以使用`

 column*1 = column 

`运算符有趣:)是工作和比字段varchar / char更快

SELECT * FROM myTable WHERE列* 1 =列;

 ABC*1 => 0 (NOT EQU **ABC**) AB15*A => 15 (NOT EQU **AB15**) 15AB => 15 (NOT EQU **15AB**) 15 => 15 (EQUALS TRUE **15**) 

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

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

然后当你查询

 select isnumber('383XXXX') 

– 退回0

 select isnumber('38333434') 

– 退回1

从tablex中selectisnumber(mycol)mycol1,col2,colx; – 将为列mycol1返回1和0

– 你可以增强小数,科学记数法等function。

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

  SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput'); 

希望这可以帮助。

这解决了你所有的问题? 因为string不会像数字一样计算

 SELECT * FROM myTable WHERE sign (col1)!=0 

(0)是0,但你可以限制你查询…

 SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0 

你可以使用CAST

  SELECT * from tbl where col1 = concat(cast(col1 as decimal), "")