我在Postgres数据库中有一个multiple_dates
列。
要在特定日期之前查找,我将这样写:
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
子句?
答案 0 :(得分:3)
“问题”是ANY
construct适用于操作符,而不适用于其他 constructs -BETWEEN
是另一个 construct 。
相关:
但是,有一个简单的解决方案。从给定范围构造一个daterange
并使用contains operator @>
。
相关:
然后查询可以简单地是:
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
);
占用更多的磁盘空间,更冗长的查询,但是对于大表则更快,并且用途更多。