如何在PostgreSQL中使用~*运算符实现子串匹配?
解决PostgreSQL中~*运算符匹配bpchar列子串的问题
你的正则表达式写法有误,'*. '||tasudok||' *.'里的*是正则量词,必须搭配具体的匹配元素(比如.代表任意字符),直接写*.不符合正则语法,因此触发报错。
要实现类似ILIKE的子串匹配,需要注意两点:
- 修正正则表达式的语法
- 处理
bpchar(即char类型)自动补空格的特性
修正后的实现代码
create temp table test ( tasudok char(25), nimetus char (100) ) on commit drop ; insert into test values ('123','Teie Arve 123 tasumine'); -- 最简写法:匹配包含tasudok实际值的记录 select nimetus ~* trim(tasudok) from test;
说明
- 处理bpchar的空格问题:
char(n)类型会自动在字符串末尾补空格到指定长度,trim(tasudok)会去除这些多余空格,确保匹配的是实际存储的'123'而非带大量空格的字符串。 - 正则匹配逻辑:
~*是PostgreSQL提供的大小写不敏感正则匹配运算符,只要目标字符串中包含指定的子串,就会返回true,效果等同于ILIKE '%' || trim(tasudok) || '%'。
可选:明确匹配前后任意字符(等价写法)
如果需要和ILIKE '%xxx%'的逻辑完全对应,也可以写出完整的正则表达式:
select nimetus ~* '.*' || trim(tasudok) || '.*' from test;
这里.*表示匹配任意数量的任意字符,和ILIKE中的%作用一致,但实际无需额外添加,因为正则匹配本身就会匹配子串出现的任意位置。
内容的提问来源于stack exchange,提问作者Andrus
相关产品推荐
相关产品推荐

