在 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 仅占两个百分比而不是根本不使用

sql SQL - LIKE / ILIKE + IN在Postgresql中

postgresql数据库中~和like和ilike的区别

LOWER LIKE vs iLIKE

postgresql----LIKE和SIMILAR TO

Postgresql 包含在 where 子句中