在SQL数据处理的实际场景中,我们经常会遇到需要筛选纯文本字符串的需求,比如从用户表中提取不包含数字的纯中文姓名,或者从编码表中筛选出纯字母的业务编码,这时候就需要过滤掉所有包含数字的字符串。利用REGEXP正则表达式函数可以高效实现这个需求,不同数据库的正则表达式语法略有差异,但核心逻辑一致。

REGEXP正则表达式匹配规则
要过滤包含数字的字符串,核心是正则表达式匹配数字的规则,常用的数字匹配表达式为[0-9],表示匹配0到9之间的任意一个数字。如果字符串中包含任意一个该范围内的字符,就说明字符串包含数字。对应的,不包含数字的正则表达式就是^[^0-9]*$,其中^表示字符串开头,[^0-9]表示不匹配0到9的任意字符,*表示前面的字符可以出现0次或多次,$表示字符串结尾,整体含义就是整个字符串都不包含0到9的数字。
MySQL中使用REGEXP过滤包含数字的字符串
MySQL从版本3.23.4开始支持REGEXP运算符,用于正则表达式匹配。如果要查询表中不包含数字的字符串,可以使用NOT REGEXP来判断。
假设我们有一张user_info表,结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | int | 用户ID |
| user_name | varchar(50) | 用户名称 |
现在需要查询user_name不包含数字的记录,查询语句如下:
-- 查询user_name不包含数字的记录 SELECT id, user_name FROM user_info WHERE user_name NOT REGEXP '[0-9]';
如果要查询包含数字的记录,只需要去掉NOT即可:
-- 查询user_name包含数字的记录 SELECT id, user_name FROM user_info WHERE user_name REGEXP '[0-9]';
PostgreSQL中使用~运算符实现过滤
PostgreSQL中没有REGEXP函数,而是使用~运算符表示正则匹配,!~表示不匹配正则。同样查询不包含数字的user_name记录,语句如下:
-- 查询user_name不包含数字的记录 SELECT id, user_name FROM user_info WHERE user_name !~ '[0-9]';
查询包含数字的记录使用~运算符:
-- 查询user_name包含数字的记录 SELECT id, user_name FROM user_info WHERE user_name ~ '[0-9]';
Oracle中使用REGEXP_LIKE函数实现过滤
Oracle提供了REGEXP_LIKE函数用于正则匹配,语法为REGEXP_LIKE(源字符串, 正则表达式),返回布尔值。过滤不包含数字的字符串示例如下:
-- 查询user_name不包含数字的记录 SELECT id, user_name FROM user_info WHERE NOT REGEXP_LIKE(user_name, '[0-9]');
查询包含数字的记录:
-- 查询user_name包含数字的记录 SELECT id, user_name FROM user_info WHERE REGEXP_LIKE(user_name, '[0-9]');
注意事项
- 如果字符串中包含空值NULL,REGEXP匹配的结果也会是NULL,不会返回匹配的记录,需要提前处理NULL值,比如加上
user_name IS NOT NULL的条件。 - 不同数据库对正则表达式的支持略有差异,比如部分数据库支持
d表示数字,部分不支持,建议统一使用[0-9]保证兼容性。 - 如果字符串中包含其他特殊字符,只要不包含数字,上述正则规则依然会匹配成功,符合过滤包含数字字符串的需求。
正则表达式是处理字符串匹配的高效工具,掌握REGEXP相关的使用方法,可以解决很多复杂的字符串筛选问题,除了过滤数字,还可以用于过滤邮箱、手机号等特定格式的字符串。