#sql #arrays #postgresql #where-clause #sql-null
#sql #массивы #postgresql #где-предложение #sql-null
Вопрос:
Я хотел бы использовать массив в качестве фильтра в запросе, но также мне нужно вернуть все значения, если значения не были предоставлены (с помощью PreparedStatement — java).
Что-то вроде этого:
AND column = any(coalesce(?, column_example::text[]))
Проблема в том, что column_example является столбцом varchar. Как достичь этой цели с помощью sql (postgres)?
Версия:
PostgreSQL 11.9 (Ubuntu 11.9-1.pgdg20.04 1) на x86_64-pc-linux-gnu, скомпилированный gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0, 64-разрядный
Ответ №1:
Мне нужно вернуть все значения, если значения не были предоставлены
Вы могли бы просто сделать:
AND ( ? is null or column = any(?::text[]) )
Приведение параметра к массиву может не потребоваться, в зависимости от того, способен ли ваш драйвер правильно передавать такой тип данных. Если это так:
AND ( ? is null or column = any(?) )
Комментарии:
1. С этим небольшим изменением -> И (?::text[] равно нулю или column = any(?::text[]) ) запрос сработал. Я использую org.postgresql.Driver из Jdbc.
Ответ №2:
Хммм … как насчет двух отдельных сравнений?
AND
(column = ? OR ? IS NULL AND column = any(column_example::text[]))
Вам нужно передать параметр дважды или использовать именованный параметр.
Комментарии:
1. Это не сработало для меня, потому что столбец является varchar, но я хотел бы передать аргумент массива. Кроме того, это выдало мне ошибку: ОШИБКА: неверно сформированный литерал массива: «тест» ПОДРОБНО: значение массива должно начинаться с «{» или информации об измерении. Состояние SQL: 22P02