2016-01-07 2 views
1

Я пытаюсь получить строки, где столбец типа text[] содержит значение, подобное некоторому пользовательскому вводу.PostgreSQL - text Array содержит значение, подобное

То, что я думал, что и делали до сих пор является использование 'ANY' и 'LIKE 'оператора, как это:

select * from someTable where '%someInput%' LIKE ANY(someColum); 

Но это не работает. Запрос возвращает то же значение, что этот запрос:

select * from someTable where 'someInput' = ANY(someColum); 

У меня есть хороший результат, используя unnest() функции в подзапросе, но мне нужно, чтобы запросить это в ИНЕКЕ, если это возможно.

ПОЧЕМУ оператор LIKE не работает с оператором ANY, и у меня нет ошибок? Я думал, что одна из причин, что должны быть ANY оператора в правой части запроса, но ...

Есть ли решение этой проблемы без использования unnest() и если это возможно, в WHERE пункте?

+3

Решение без использования 'unnest' было бы правильно нормализовать вашу модель данных. –

+0

Я думал создать новую таблицу вместо столбца этого типа данных, если не было другого решения. Я сделаю это, так! Спасибо за Ваш ответ! –

ответ

2

Это также важно понимать, что ANY является не оператор но конструкция SQL, которая может быть использована только в право оператора. Подробнее:

LIKE оператор - точнее: выражение, что переписывается с к ~~оператора в Postgres внутренне - ожидает, что значениевлево и рисунок направо. Для этого оператора нет COMMUTATOR (например, для простого оператора равенства =), поэтому Postgres не может переворачивать операнды.

Попытка:

select * from someTable where '%someInput%' LIKE ANY(someColum); 

имеет перевернутый левый и правый операнд так '%someInput%' является значение и элементы столбца массива someColum принимаются равными модели (это не то, что вы хотите).

Это бы должны быть ANY(someColum) LIKE '%someInput%' - за исключением того, что не представляется возможным с ANY конструкцией, которая разрешена только в право оператора. Вы попадаете в дорожный блок здесь.

Похожие:

unnest() это решение, как вы уже нашли себя - или сохранить элементы вместо массива начать с (нормализуют схема).

+0

Спасибо за информацию! –

Смежные вопросы