PostgreSQL匹配同时含foo和bar的text列时SIMILAR TO报错如何解决
报错原因
SIMILAR TO 运算符使用SQL标准定义的正则语法,不支持Perl兼容正则(PCRE)的正向预查语法(?=...),因此你写的正则表达式会抛出「quantifier operand invalid」的语法错误。
解决方案
以下三种方案都可以实现同时包含foo和bar的匹配需求,你可以根据实际场景选择:
方案1:使用POSIX正则匹配(兼容你的预查写法)
SELECT * FROM string_entries WHERE str ~ '^(?=.*foo)(?=.*bar)';说明:
~是PostgreSQL原生的POSIX正则匹配操作符,支持预查语法,默认区分大小写,需忽略大小写可替换为~*。方案2:LIKE组合查询(性能最优)
SELECT * FROM string_entries WHERE str LIKE '%foo%' AND str LIKE '%bar%';说明:不需要正则语法,逻辑简单直观,若
str字段建有模糊查询相关索引,查询性能远高于正则方案,适合仅需子串匹配的普通场景。方案3:精确匹配独立分隔项
如果你需要匹配的是逗号分隔的完整独立元素(避免foobar,test这类包含子串但不是独立foo/bar的误匹配),可以用数组包含判断:SELECT * FROM string_entries WHERE string_to_array(str, ',') @> ARRAY['foo','bar'];说明:
string_to_array会按逗号拆分字段为数组,@>是数组包含运算符,可判断左侧数组是否完全包含右侧的所有元素,匹配精度更高。
内容的提问来源于stack exchange,提问作者xqcccccccccc
相关产品推荐
相关产品推荐

