ОБЪЕДИНЕНИЕ и МАССИВ в postgresql — запрос

#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