如何使用SQL筛选字段中的非数值(字母、符号)数据?
解决方案:筛选非数值类记录
要从col1中仅提取字母、符号类数据(排除所有整数、浮点数,包括科学计数法格式的数值),可以根据你使用的数据库类型,选择对应的SQL语句:
MySQL/MariaDB
使用正则表达式匹配非数值记录,同时排除空值:
SELECT DISTINCT col1 FROM table WHERE col1 IS NOT NULL AND col1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
解释:正则表达式^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$会匹配所有合法的数值格式(正负整数、正负浮点数、科学计数法表示的数值),NOT REGEXP则筛选出不匹配这些格式的记录。
PostgreSQL
和MySQL逻辑一致,使用~运算符进行正则匹配:
SELECT DISTINCT col1 FROM table WHERE col1 IS NOT NULL AND col1 NOT ~ '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
SQL Server(2012及以上版本)
推荐用TRY_CAST函数更简洁可靠:它会尝试将col1转换为浮点数,转换失败则返回NULL,直接筛选这类记录即可:
SELECT DISTINCT col1 FROM table WHERE col1 IS NOT NULL AND TRY_CAST(col1 AS FLOAT) IS NULL;
如果你的SQL Server版本不支持TRY_CAST,可以用正则匹配替代:
SELECT DISTINCT col1 FROM table WHERE col1 IS NOT NULL AND PATINDEX('%[^0-9.-+eE]%', col1) > 0 -- 额外排除仅含符号但不是有效数值的情况,比如'---'或'..' AND NOT (col1 LIKE '%[^0-9]%' AND col1 NOT LIKE '%[0-9]%');
Oracle
使用REGEXP_LIKE函数实现正则筛选:
SELECT DISTINCT col1 FROM table WHERE col1 IS NOT NULL AND NOT REGEXP_LIKE(col1, '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$');
补充说明
- 若不需要考虑科学计数法格式的数值,可以把正则中的
([eE][-+]?[0-9]+)?部分去掉,简化表达式。 - 若数据中存在空字符串(
''),可在WHERE条件中添加AND col1 <> ''来排除。
内容的提问来源于stack exchange,提问作者James Raitsev
相关产品推荐
相关产品推荐

