如何在 Postgres 中对数组列使用 BETWEEN 条件?
How to use BETWEEN condition for array column in Postgres?
我在 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
子句?
"problem" 是 ANY
construct 适用于 运算符 ,不适用于其他 构造 - 和 BETWEEN
是另一个 结构 .
相关:
不过,有一个简单的解决方案。构造一个daterange
from the given bounds and use the contains operator @>
.
相关:
那么查询可以简单地是:
SELECT *
FROM companies
WHERE daterange('2019-06-01', '2019-06-30', '[]') @> ANY (multiple_dates)
注意第三个参数 '[]'
构造具有 包含 边界的范围以匹配 BETWEEN
.
的行为
备选方案: 规范化您的架构。创建一个 n:1 table 像:
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
);
在磁盘上占用更多 space,查询更冗长,但对于大 tables 和更通用的速度更快。
我在 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
子句?
"problem" 是 ANY
construct 适用于 运算符 ,不适用于其他 构造 - 和 BETWEEN
是另一个 结构 .
相关:
不过,有一个简单的解决方案。构造一个daterange
from the given bounds and use the contains operator @>
.
相关:
那么查询可以简单地是:
SELECT *
FROM companies
WHERE daterange('2019-06-01', '2019-06-30', '[]') @> ANY (multiple_dates)
注意第三个参数 '[]'
构造具有 包含 边界的范围以匹配 BETWEEN
.
备选方案: 规范化您的架构。创建一个 n:1 table 像:
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
);
在磁盘上占用更多 space,查询更冗长,但对于大 tables 和更通用的速度更快。