SQL如何查找非空字符串 正则匹配返回0问题排查
问题原因
正则匹配返回0结果的核心原因是标准SQL的LIKE操作符不支持正则表达式语法。LIKE仅支持两个专用通配符:
%:匹配任意长度(含0长度)的任意字符_:匹配单个任意字符
你写的^、(?!\s*$)属于正则专属语法,放在LIKE语句中会被当做普通字面字符做匹配——CONTACTPHONE2字段存储的是电话号码,本身不包含^、(这类符号,自然匹配不到任何记录,COUNT统计结果为0。
解决方案
通用兼容写法(全数据库支持,性能更优)
如果只是要排除空字符串、全空格组成的空白值,不需要使用正则,直接用字符串函数判断即可,兼容性和执行效率都优于正则匹配:
-- 排除空串、全空格的无效电话号码记录 SELECT COUNT(CONTACTPHONE2) FROM Auct_ABSENTEEBID WHERE LTRIM(RTRIM(CONTACTPHONE2)) <> ''
不同数据库的空格裁剪函数略有差异:
- MySQL、Oracle、PostgreSQL可以直接用
TRIM(CONTACTPHONE2) <> ''实现相同效果- 低版本SQL Server不支持直接用
TRIM处理全空格场景,用LTRIM+RTRIM的写法兼容性最好
正则匹配的正确写法
如果确实需要使用正则做复杂规则匹配,需要使用对应数据库提供的专属正则匹配语法,不能直接把正则写在LIKE后:
- MySQL:使用
REGEXP/RLIKE操作符
SELECT COUNT(CONTACTPHONE2) FROM Auct_ABSENTEEBID WHERE CONTACTPHONE2 REGEXP '^(?!\\s*$).*'
- PostgreSQL:使用
~操作符匹配正则
SELECT COUNT(CONTACTPHONE2) FROM Auct_ABSENTEEBID WHERE CONTACTPHONE2 ~ '^(?!\s*$).*'
- Oracle:使用
REGEXP_LIKE函数
SELECT COUNT(CONTACTPHONE2) FROM Auct_ABSENTEEBID WHERE REGEXP_LIKE(CONTACTPHONE2, '^(?!\s*$).*')
- SQL Server 2017及以上版本:可以使用内置通配符匹配非空值,2019及以上版本支持
REGEXP_LIKE
-- 原生写法排除空串、全空格记录 SELECT COUNT(CONTACTPHONE2) FROM Auct_ABSENTEEBID WHERE CONTACTPHONE2 LIKE '%[^ ]%'
内容的提问来源于stack exchange,提问作者user8314628
相关产品推荐
相关产品推荐

