是否有一种方法来检测一个值在MySQL查询中是否是一个数字?如

SELECT * 
FROM myTable 
WHERE isANumber(col1) = true

当前回答

这个答案与Dmitry类似,但它允许小数以及正数和负数。

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

其他回答

您可以使用正则表达式的mor细节https://dev.mysql.com/doc/refman/8.0/en/regexp.html

我用这个^([,|.]?[0-9])+$。这个函数允许对小数和浮点数进行句柄处理

SELECT
    *
FROM
    mytable
WHERE
    myTextField REGEXP "^([,|.]?[0-9])+$"

这个答案与Dmitry类似,但它允许小数以及正数和负数。

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

使用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

Select isnumber(mycol) mycol1, col2, colx; ——将为列mycol1返回1和0

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

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

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

希望这能有所帮助。

返回数字行

我发现解决方案与以下查询和工作为我:

SELECT * FROM myTable WHERE col1 > 0;

这个查询返回的行只包含大于0的数字列col1

返回非数字行

如果你想检查列不是数字,试试这个技巧(!Col1 > 0):

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

当然sign(0)是0,但是你可以把你的查询限制为…

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

更新:这不是100%可靠,因为“1abc”将返回符号 1,但是“ab1c”将返回0…所以这只适用于不以数字开头的文本。