如何在Postgres中的数组列中使用BETWEEN条件?

时间:2019-06-28 23:03:02

标签: sql postgresql operators between date-range

我在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无效。如何同时使用ANYBETWEEN子句?

1 个答案:

答案 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
   );

占用更多的磁盘空间,更冗长的查询,但是对于大表则更快,并且用途更多。