Как использовать условие BETWEEN для столбца массива в Postgres? - PullRequest
2 голосов
/ 29 июня 2019

У меня есть столбец multiple_dates в БД Postgres.
Чтобы найти к определенной дате, я пишу так:

SELECT * FROM companies
WHERE  '2019-06-30' = ANY (multiple_dates)

Но я хочу выполнить поиск по определенному периоду, используя предложение BETWEEN, например:

SELECT * FROM companies
WHERE  (ANY (multiple_dates) BETWEEN '2019-06-01' AND '2019-06-30')  -- pseudo-code

Этот SQL не работал. Как я могу использовать предложения ANY и BETWEEN одновременно?

1 Ответ

3 голосов
/ 29 июня 2019

«Проблема» в том, что конструкция ANY работает для операторов , а не для других конструкций - и BETWEEN это еще одна конструкция .

Связанный:

Хотя для этого есть простое решение . Построить daterange из заданных границ и использовать оператор содержит @>.

Связанный:

Тогда запрос может быть просто:

SELECT *
FROM   companies
WHERE  daterange('2019-06-01', '2019-06-30', '[]') @> ANY (multiple_dates)

Обратите внимание на третий аргумент '[]', чтобы построить диапазон с включительно границами, чтобы соответствовать поведению BETWEEN.


Альтернатива: нормализовать вашу схему. Создайте таблицу n: 1, например:

CREATE TABLE company_date
   company_id  int NOT NULL REFERENCES companies
 , single_date date NOT NULL
 , PRIMARY KEY (company_id, single_date)
);

Также добавить индекс на (single_date, company_id). См:

Тогда ваш запрос может быть:

SELECT c.*
FROM   companies c
WHERE  EXISTS (
   SELECT FROM company_date cd
   WHERE  single_date BETWEEN '2019-06-01' AND '2019-06-30'
   AND    cd.company_id = c.company_id
   );

Занимает больше места на диске, более подробный запрос, но намного быстрее для больших таблиц и более универсален.

...