在 PostgreSQL 中查询 iLike 列表
Posted
技术标签:
【中文标题】在 PostgreSQL 中查询 iLike 列表【英文标题】:Query for iLike list in PostgreSQL 【发布时间】:2016-07-12 19:28:06 【问题描述】:我正在写一个低效的查询如下:
WHERE (Field iLIKE '%cat%' OR Field iLIKE '%dog%' OR Field iLIKE '%animal%' OR Field iLIKE '%pet%')
而我想写的是:
WHERE Field iLIKE ('%cat%','%dog%','%animal%','%pet%')
有没有简单的方法可以做到这一点?
【问题讨论】:
或许可以使用SIMILAR TO
语法
重复***.com/questions/4928054/…
我尝试了 WHERE(类似于 '%(cat|dog|animal)%' 的描述),但没有成功。可以请教吗?
【参考方案1】:
您可以获得强大的正则表达式运算符~
和~*
不区分大小写:
WHERE Field ~* '(cat|dog|animal|pet)'
SIMILAR TO
区分大小写,所以你必须这样做:
WHERE Field SIMILAR TO '%([Cc][Aa][Tt]|[Dd][Oo][Gg]|[Aa][Nn][Ii][Mm][Aa][Ll]|[Pp][Ee][Tt])%'
ANY ARRAY
也可以,但性能更差:
WHERE Field ILIKE ANY (array['%cat%','%dog%','%animal%','%pet%'])
在Field
中有一些带有 BTREE INDEX 的 1000000 行的虚拟数据,我得到以下结果:
╔═════════════╦═════════════╗
║ Operator ║ Time (secs) ║
╠═════════════╬═════════════╣
║ ~* ║ 1.5 ║
║ SIMILAR TO ║ 1.4 ║
║ ANY ARRAY ║ 4.0 ║
║ OR OR OR... ║ 4.0 ║
╚═════════════╩═════════════╝
【讨论】:
【参考方案2】:select 'cata' ilike any (array['%cat%','%dog%','%animal%','%pet%']);
?column?
----------
t
【讨论】:
以上是关于在 PostgreSQL 中查询 iLike 列表的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL 性能,使用 ILIKE 仅占两个百分比而不是根本不使用