查询PostgreSQL中的iLike列表

时间:2016-07-12 19:28:06

标签: sql postgresql

我正在编写一个效率低下的查询,如下所示:

WHERE (Field iLIKE '%cat%' OR Field iLIKE '%dog%' OR Field  iLIKE '%animal%' OR Field  iLIKE '%pet%') 

而我想写的是:

WHERE Field iLIKE ('%cat%','%dog%','%animal%','%pet%')

有没有一种简单的方法可以实现这一目标?

2 个答案:

答案 0 :(得分:4)

您可以获得功能强大的正则表达式运算符~~*,以区分大小写:

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中有一些带有1000000行和BTREE INDEX的伪数据时,我得到了这些结果:

╔═════════════╦═════════════╗
║  Operator   ║ Time (secs) ║
╠═════════════╬═════════════╣
║ ~*          ║ 1.5         ║
║ SIMILAR TO  ║ 1.4         ║
║ ANY ARRAY   ║ 4.0         ║
║ OR OR OR... ║ 4.0         ║
╚═════════════╩═════════════╝

答案 1 :(得分:0)

select 'cata' ilike any (array['%cat%','%dog%','%animal%','%pet%']);
 ?column? 
----------
 t