首页 > 解决方案 > 搜索 PostgreSQL 数组列

问题描述

我正在尝试使用 PostgreSQL 数组。我添加了一个专栏:

dates date[]

其中包含日期数组。我想选择在一个范围内至少有一个日期的行。

我发现唯一可行的解​​决方案是:

SELECT *
FROM archive
WHERE '2021-07-01' <= ANY(dates) AND '2021-09-30' >= ANY(dates);

在我看来,这看起来不自然。我通常会将目标值放在比较运算符之后。

我更喜欢这样的东西:

SELECT *
FROM archive
WHERE ANY(dates) BETWEEN '2021-07-01' AND '2021-09-30';

但这不起作用。

是否有其他方法可以进行此搜索?

标签: arrayspostgresqlwhere-clause

解决方案


你可以使用这个WHERE条件:

WHERE daterange('2021-07-01', '2021-09-30', '[]') @> ANY (dates)

这将测试区间是否包含任何dates.

解释一些伏都教可能会有所帮助:

  • daterange()没有第三个参数会创建一个半开范围——它包括第一个日期,但不包括最后一个日期。要创建封闭的日期范围,您需要第三个参数'[]'。有关详细信息,请参阅文档

  • 运算符@>测试右侧的元素是否包含在左侧的区间中。在这种情况下,第一个范围是否包括第二个?有关详细信息,请参阅文档

  • operator ANY (array)将左侧表达式与右侧数组的每个成员进行比较。如果数组的任何元素满足比较,则结果为TRUE。同样,这是一个文档链接


推荐阅读