You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;

说明

  1. 处理bpchar的空格问题:char(n)类型会自动在字符串末尾补空格到指定长度,trim(tasudok)会去除这些多余空格,确保匹配的是实际存储的'123'而非带大量空格的字符串。
  2. 正则匹配逻辑:~*是PostgreSQL提供的大小写不敏感正则匹配运算符,只要目标字符串中包含指定的子串,就会返回true,效果等同于ILIKE '%' || trim(tasudok) || '%'。

可选:明确匹配前后任意字符(等价写法)

如果需要和ILIKE '%xxx%'的逻辑完全对应,也可以写出完整的正则表达式:

select nimetus ~* '.*' || trim(tasudok) || '.*' from test;

这里.*表示匹配任意数量的任意字符,和ILIKE中的%作用一致,但实际无需额外添加,因为正则匹配本身就会匹配子串出现的任意位置。

内容的提问来源于stack exchange,提问作者Andrus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:00:59