我正在编写一个效率低下的查询,如下所示:
WHERE (Field iLIKE '%cat%' OR Field iLIKE '%dog%' OR Field iLIKE '%animal%' OR Field iLIKE '%pet%')
而我想写的是:
WHERE Field iLIKE ('%cat%','%dog%','%animal%','%pet%')
有没有一种简单的方法可以实现这一目标?
答案 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