模式匹配
模式匹配按规则判断文本是否符合预期。PostgreSQL 提供 LIKE、SIMILAR TO 和 POSIX 正则表达式;三者的特殊字符含义并不相同。
LIKE 与 ILIKE
SELECT 'PostgreSQL' LIKE 'Post%'; -- true
SELECT 'PostgreSQL' ILIKE 'post%'; -- true,忽略大小写
SELECT 'a_b' LIKE 'a\_b' ESCAPE '\'; -- true,按字面匹配下划线
% 匹配零个或多个字符,_ 匹配恰好一个字符;模式要求匹配整个字符串,需要包含某段文字时写 '%片段%'。ILIKE 是 PostgreSQL 扩展,大小写行为受区域设置影响。NOT LIKE、NOT ILIKE 是反向判断,但输入为 NULL 时结果仍是未知。
正则表达式
SELECT 'abc123' ~ '^[a-z]+[0-9]+$'; -- true
SELECT 'ABC123' ~* '^[a-z]+[0-9]+$'; -- true,忽略大小写
SELECT regexp_replace('a1 b2', '[0-9]', '#', 'g'); -- a# b#
~、~* 分别进行区分与不区分大小写的正则匹配;!~、!~* 取反。正则默认只需匹配字符串的一部分,^、$ 用于约束首尾。regexp_match 提取首次匹配及捕获组,regexp_matches(..., 'g') 可产生多行匹配结果;regexp_replace 的 g 标志表示替换全部匹配。反斜杠在 SQL 字面量和正则内部各有意义,复杂模式建议使用绑定参数并做实测。
SIMILAR TO 与选择
SIMILAR TO 混合了 SQL 通配符和部分正则语法,仍要求匹配整个字符串:
SELECT 'abc123' SIMILAR TO '(abc|def)%'; -- true
简单前缀或通配符用 LIKE,需要字符类、捕获与替换时用正则;不要把 LIKE 的 % 直接放进 ~ 模式。前缀匹配可能利用合适的索引及操作符类,但前导 % 或一般正则往往不能使用普通 B-tree 前缀索引;高频模糊搜索可考虑 pg_trgm 扩展并用 EXPLAIN 验证。正则处理不受信任的复杂模式时还需控制资源消耗。