2016-07-12 2 views
1

Я пишу неэффективный запрос следующим образом:запросов для списка ILIKE в PostgreSQL

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

тогда, что я хотел бы написать это:

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

Есть простой способ для достижения этой цели ?

+0

можно использовать 'ПОДОБНЫХ в' синтаксис возможно – reptilicus

+0

дубликата http://stackoverflow.com/questions/4928054/postgresql-wildcard-like-for-any-of-a-list-of-words –

+0

Я пробовал ГДЕ (ОПИСАНИЕ похоже на «% (cat | dog | animal)% '), и это не сработало. Могли бы вы, пожалуйста, посоветовать? – ZJAY

ответ

0
select 'cata' ilike any (array['%cat%','%dog%','%animal%','%pet%']); 
?column? 
---------- 
t 
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%']) 

С некоторыми фиктивными данными с рядами 1000000 с BTREE INDEX в Field, я получаю эти результаты:

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