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
Ric*_*iwi 232
这应该适用于大多数情况.
SELECT * FROM myTable WHERE concat('',col1 * 1) = col1
Run Code Online (Sandbox Code Playgroud)
它不适用于非标准数字
1e41.2e5123. (尾随小数)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'
这个答案类似于德米特里,但它将允许小数以及正数和负数.
select * from table where col1 REGEXP '^[[:digit:]]+$'
Run Code Online (Sandbox Code Playgroud)
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)
返回数字行
我通过以下查询找到了解决方案并为我工作:
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)
小智 5
在我的计算机上看起来比REGEXP更快的另一种选择是
SELECT * FROM myTable WHERE col1*0 != col1;
Run Code Online (Sandbox Code Playgroud)
这将选择col1以数字值开头的所有行.
仍然缺少这个简单的版本:
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)
使用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)
希望这可以帮助.