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

SELECT * 
FROM myTable 
WHERE isANumber(col1) = true

当前回答

我发现这很有效

if(col1/col1= 1,'number',col1) AS myInfo

其他回答

你可以使用CAST

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

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

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

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

我建议:如果你的搜索很简单,你可以使用'

column*1 = column

' operator interesting:)是工作,并且比varchar/char字段更快

SELECT * FROM myTable WHERE column = 1;

ABC*1 => 0 (NOT EQU **ABC**)
AB15*A => 15 (NOT EQU **AB15**)
15AB => 15 (NOT EQU **15AB**)
15 => 15 (EQUALS TRUE **15**)
SELECT * FROM myTable
WHERE col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$'

也会匹配带符号的小数(如-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;

结果:

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

Demo

在我的计算机上,另一个似乎比REGEXP更快的替代方法是

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

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