检测MySQL中的值是否为数字

时间:2011-02-21 10:44:29

标签: sql mysql

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

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

15 个答案:

答案 0 :(得分:242)

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

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

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

答案 1 :(得分:213)

这在大多数情况下都适用。

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

它不适用于非标准数字,如

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

答案 2 :(得分:49)

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

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

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

结果:'111'

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

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

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

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

最后,选择所有存在号码的记录,请使用:

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

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

答案 3 :(得分:8)

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

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

答案 4 :(得分:6)

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

答案 5 :(得分:5)

另一种似乎比我的计算机上的REGEXP更快的替代方案是

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

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

答案 6 :(得分: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;

然后当你查询

select isnumber('383XXXX') 

- 返回0

select isnumber('38333434') 

- 返回1

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

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

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

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

希望这会有所帮助。

答案 7 :(得分:4)

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

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

答案 8 :(得分:4)

返回数字行

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

@for $i from 1 through 10 {
    @for $j from 1 through 10 {
      @for $k from 1 through 10 {
      .color-#{$i*10}-#{$j*10}-#{$k*10}{
        color:rgb($i*10,$j*10,$k*10);
      }
    }
  }
}

此查询返回的行仅具有大于SELECT * FROM myTable WHERE col1 > 0;

的零列

返回非数字行

如果您要检查非数字列,请尝试使用技巧({{1}):

col1

答案 9 :(得分:3)

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

column*1 = column

`operator interesting :)比字段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**)

答案 10 :(得分:1)

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

ofcourse sign(0)为零,但是您可以将查询限制为...

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

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

答案 11 :(得分:0)

  

您可以使用CAST

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

答案 12 :(得分:0)

我发现这很有效

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

答案 13 :(得分:0)

您可以使用正则表达式来显示详细信息https://dev.mysql.com/doc/refman/8.0/en/regexp.html

我使用了这个^([,|.]?[0-9])+$。这允许处理小数和浮点数

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

答案 14 :(得分:-1)

尝试Dividing / 1

select if(value/1>0 or value=0,'its a number', 'its not a number') from table