我正在尝试从 ILIKE 移至 Postgres ~* 运算符。表有 bpchar 列(无法更改)。在 Postgres 12 中尝试过
create temp table test ( tasudok char(25), nimetus char (100) ) on commit drop ;
insert into test values ('123','Teie Arve 123 tasumine');
select nimetus ~* '*. '||tasudok||' *.' from test;
但出现错误
错误:无效的正则表达式:量词操作数无效
如何使用 ~* 运算符进行子字符串匹配?
简单地:
您根本不需要像使用 那样填充模式
ILIKE
。等效1:1除了“模式”列中的特殊字符
tasudok
具有不同含义外。请参阅:运算符优先级
值得注意的是,
ILIKE
和LIKE
在运算符优先级上比默认运算符低一级,因此我的表达式不需要括号。严格来说,LIKE
不是运算符,而是 SQL 构造,由 Postgres 运算符~~
内部实现。(~~*
forILIKE
、!~~
forNOT LIKE
、!~~*
forNOT ILIKE
)还要注意的是,这些内部运算符具有默认运算符优先级(正则表达式运算符
~
、~*
、!~
和 也是如此!~*
)。因此,对于这些运算符,需要在连接字符串周围加上括号。只是你不需要在你的示例中连接任何东西。否则会产生昂贵的噪音。
您的代码
*.
可能本来应该是这样的,.*
但出于某种原因,代码被颠倒了。*
预期行首之前会有其他内容,但它正好位于模式的开头,因此出现错误。翻转这些内容,它就可以正常工作:db-fiddle 上的演示
9.7.3.1. 正则表达式详细信息中有一条注释警告这一点:
您可能还想将连接的字符串括起来,否则它们将从左到右进行评估。结果,只有第一个匹配,结果
boolean
被转换为text
,然后连接到tasudok
,然后连接到' *.'
: