Също така е важно да разберете, че ANY
ене оператора но SQL конструкция, която може да се използва само вдясно на оператор. Още:
- Как да използвам ANY вместо IN в клауза WHERE с Rails?
LIKE
оператор - или по-точно:израз , което се пренаписва с в ~~
оператор в Postgres вътрешно - очаква стойността вляво и шаблонът надясно. Няма COMMUTATOR
за този оператор (както има за простия оператор за равенство =
), така че Postgres не може да обръща операндите.
Вашият опит:
select * from someTable where '%someInput%' LIKE ANY(someColum);
е обърнал левия и десния операнд, така че '%someInput%'
е стойността и елементи от колоната на масива someColum
се приемат за шаблони (което не е това, което искате).
Това ще трябва да е ANY(someColum) LIKE '%someInput%'
- с изключение на това, че това не е възможно с ANY
конструкция, която е разрешена само вдясно на оператор. Тук се натъквате на блокада.
Свързано:
- Има ли начин за полезно индексиране на текстова колона, съдържаща модели на регулярни изрази?
- Може ли PostgreSQL да индексира колони от масиви?
Можете да нормализирате своя релационен дизайн и да запазите елементи от масива в отделни редове в отделна таблица. С изключение на това, unnest()
е решението, както вече открихте. Но докато се интересувате само от съществуването на поне един съответстващ елемент, EXISTS
подзаявката ще бъде най-ефективна, като същевременно избягва дублирането в резултата - Postgres може да спре търсенето веднага щом бъде намерено първото съвпадение:
SELECT *
FROM tbl
WHERE EXISTS (
SELECT -- can be empty
FROM unnest(someColum) elem
WHERE elem LIKE '%someInput%'
);
Може да искате да избягвате специалния символ в someInput
. Вижте:
- Escape функция за регулярен израз или LIKE шаблони
Внимавайте с отрицанието (NOT LIKE ALL (...)
). ), когато NULL
може да участва:
- Проверете дали NULL съществува в Postgres масив