«Проблема» в том, что конструкция 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
);
Занимает больше места на диске, более подробный запрос, но намного быстрее для больших таблиц и более универсален.