在PostgreSQL的存储过程开发中,字符串模糊匹配是处理文本类数据的常见需求,开发者可以通过LIKE关键字或者正规表达式两种方式实现该能力,两种方式各有适用的场景和特性。

使用LIKE进行字符串模糊匹配
LIKE是SQL标准中定义的模糊匹配关键字,语法简单,适合处理简单的通配符匹配场景,在PostgreSQL存储过程中可以直接使用。
LIKE的通配符规则
- 百分号
%:匹配任意长度的任意字符,包括零长度字符 - 下划线
_:匹配单个任意字符 - 如果要匹配通配符本身,需要使用转义字符,默认转义字符为反斜杠
,也可以通过ESCAPE关键字自定义转义字符
存储过程中的LIKE使用示例
以下是一个简单的存储过程示例,实现根据输入的用户名片段查询匹配的用户信息:
CREATE OR REPLACE PROCEDURE query_user_by_name_fragment(
IN p_name_fragment TEXT,
OUT p_result REFCURSOR
)
LANGUAGE plpgsql
AS $$
BEGIN
-- 打开游标返回匹配的用户数据
OPEN p_result FOR
SELECT user_id, user_name, email
FROM sys_user
WHERE user_name LIKE '%' || p_name_fragment || '%';
END;
$$;
-- 调用存储过程示例
BEGIN;
CALL query_user_by_name_fragment('张', 'cur_user');
FETCH ALL FROM cur_user;
COMMIT;
使用正规表达式进行字符串模糊匹配
PostgreSQL支持POSIX正规表达式和Perl兼容正规表达式(PCRE),匹配能力比LIKE更强大,适合处理复杂的文本匹配规则。
常用的正规表达式匹配操作符
~:区分大小写的正规表达式匹配~*:不区分大小写的正规表达式匹配!~:区分大小写的正规表达式不匹配!~*:不区分大小写的正规表达式不匹配
存储过程中的正规表达式使用示例
以下存储过程实现查询邮箱符合指定正规表达式规则的用户,比如匹配所有163邮箱的用户:
CREATE OR REPLACE PROCEDURE query_user_by_email_regex(
IN p_email_regex TEXT,
OUT p_result REFCURSOR
)
LANGUAGE plpgsql
AS $$
BEGIN
OPEN p_result FOR
SELECT user_id, user_name, email
FROM sys_user
-- 使用~操作符进行区分大小写的正规表达式匹配
WHERE email ~ p_email_regex;
END;
$$;
-- 调用存储过程查询163邮箱用户
BEGIN;
CALL query_user_by_email_regex('.*@163.com$', 'cur_email_user');
FETCH ALL FROM cur_email_user;
COMMIT;
两种匹配方式的对比与选择
| 对比维度 | LIKE | 正规表达式 |
|---|---|---|
| 匹配能力 | 仅支持%和_两种简单通配符 | 支持复杂的模式规则,如字符集、重复次数、分组等 |
| 性能 | 简单匹配场景下性能更优,可利用前缀索引 | 复杂匹配场景下更灵活,但简单场景下性能弱于LIKE |
| 适用场景 | 简单的片段匹配、前缀匹配、后缀匹配 | 复杂的文本规则匹配、格式校验类匹配 |
在实际开发中,如果只需要简单的通配符匹配,优先选择LIKE;如果需要处理复杂的文本规则,再选择正规表达式实现,这样可以在保证功能的前提下获得更好的执行性能。
PostgreSQL存储过程字符串模糊匹配LIKE正规表达式修改时间:2026-07-18 19:00:12