如何筛选字段值不含字母或数字的SQL记录?正则表达式问题
解决字段值全字母/数字的筛选问题
你原来的正则写法问题在于:[a-zA-Z0-9]只会检查字符串中是否存在至少一个字母或数字,不管有没有其他字符,所以哪怕字符串里混了=这类符号,只要有字母/数字就会返回true。而你需要的是判断整个字符串是否完全由字母或数字组成,这时候就得给正则加上锚点来限定范围。
正确的正则表达式写法
用^(匹配字符串开头)和$(匹配字符串结尾)把字符集包起来,再用+表示至少有一个符合要求的字符:
REGEXP_LIKE(your_column, '^[a-zA-Z0-9]+$')
这样测试你给的例子:
select regexp_like('abc123', '^[a-zA-Z0-9]+$')→ 返回true(全是字母数字)select regexp_like('abc123=', '^[a-zA-Z0-9]+$')→ 返回false(包含非字母数字的=)
实际筛选场景
1. 获取全部由字母/数字组成的记录
如果要从表中筛选出target_column字段值全是字母或数字的行:
SELECT * FROM your_table WHERE REGEXP_LIKE(target_column, '^[a-zA-Z0-9]+$');
2. 获取包含非字母/数字的记录
如果是要找字段里有非字母数字的行(也就是你说的“包含非字母或数字值的所有行”),只需要加NOT取反:
SELECT * FROM your_table WHERE NOT REGEXP_LIKE(target_column, '^[a-zA-Z0-9]+$');
补充说明
如果你的数据库支持更简洁的字符类(比如Oracle 10g+),可以用[:alnum:]代替[a-zA-Z0-9],写法更简洁:
REGEXP_LIKE(your_column, '^[[:alnum:]]+$')
这个字符类会匹配所有字母和数字,和[a-zA-Z0-9]效果一致,还能兼容其他语言的字母(如果有需要的话)。
内容的提问来源于stack exchange,提问作者alwaystrying
相关产品推荐
相关产品推荐

