SQL正则表达式是用于在SQL语句中处理字符串的特殊规则表达式,能够通过模式匹配快速完成字符串的筛选、提取和校验,大幅降低复杂字符串处理的难度。在实际业务的数据处理场景中,经常会遇到不规范的用户输入数据、格式混乱的日志文本等需要处理的内容,传统字符串函数处理这类场景效率较低,而正则表达式是更优的解决方案。

SQL正则表达式基础语法
SQL正则表达式的基础语法和通用正则规则基本一致,常用的匹配规则如下:
.:匹配任意单个字符*:匹配前面的字符零次或多次+:匹配前面的字符一次或多次^:匹配字符串的开头$:匹配字符串的结尾[abc]:匹配中括号内的任意一个字符[0-9]:匹配任意数字字符d:匹配数字字符,部分数据库需要转义为\d
不同数据库的正则函数使用
MySQL中的正则应用
MySQL使用REGEXP操作符或者REGEXP_LIKE函数进行正则匹配,示例代码如下:
-- 查询user表中手机号格式正确的记录,假设手机号为11位纯数字
SELECT *
FROM user
WHERE phone REGEXP '^[0-9]{11}$';
-- 使用REGEXP_LIKE函数提取邮箱后缀为ipipp.com的用户
SELECT username, email
FROM user
WHERE REGEXP_LIKE(email, '@ipipp\.com$');
PostgreSQL中的正则应用
PostgreSQL支持~操作符进行正则匹配,同时提供regexp_match等函数用于提取匹配内容:
-- 查询content字段中包含连续3个以上数字记录的日志表
SELECT *
FROM log
WHERE content ~ '[0-9]{3,}';
-- 提取url字段中的域名部分
SELECT regexp_match(url, 'https?://([^/]+)') AS domain
FROM page_visit;
Oracle中的正则应用
Oracle使用REGEXP_LIKE函数进行匹配,同时提供REGEXP_SUBSTR等函数处理字符串:
-- 查询员工表中工号符合前2位字母后4位数字格式的记录
SELECT emp_name, emp_no
FROM employee
WHERE REGEXP_LIKE(emp_no, '^[A-Za-z]{2}[0-9]{4}$');
-- 从description字段中提取第一个出现的邮箱地址
SELECT REGEXP_SUBSTR(description, '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}') AS first_email
FROM product;
实战场景示例
场景1:过滤无效手机号
业务表中可能存在格式错误的手机号,使用正则可以快速筛选出有效数据:
-- MySQL环境,筛选11位纯数字且以1开头的手机号
SELECT user_id, phone
FROM user_info
WHERE phone REGEXP '^1[0-9]{10}$';
场景2:提取文本中的特定内容
从订单备注中提取快递单号,假设快递单号为10-15位纯数字:
-- PostgreSQL环境,提取备注中的快递单号
SELECT order_id, regexp_match(remark, '[0-9]{10,15}') AS express_no
FROM order_record
WHERE remark ~ '[0-9]{10,15}';
场景3:数据清洗替换
将用户输入文本中的多余空格替换为单个空格:
-- Oracle环境,替换连续多个空格为单个空格 UPDATE user_input SET content = REGEXP_REPLACE(content, ' +', ' ') WHERE content LIKE '% %';
注意事项
使用SQL正则表达式时需要注意不同数据库的语法差异,部分数据库的正则操作符和函数名称不同,编写时需要对应具体数据库的规则。同时正则匹配的性能比普通字符串函数略低,如果是对大表的全表匹配,建议先通过其他条件缩小数据范围再使用正则,避免查询性能下降。