搜索 PostgreSQL 数组列
Searching through PostgreSQL array columns
我正在尝试使用 PostgreSQL 数组。我添加了一列:
dates date[]
其中包含一个日期数组。我想要 select 行,其中至少有一个日期在一个范围内。
我发现唯一可行的解决方案是:
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';
但这不起作用。
是否有其他方法进行此搜索?
您可以使用这个 WHERE
条件:
WHERE daterange('2021-07-01', '2021-09-30', '[]') @> ANY (dates)
这将测试区间是否包含任何 dates
.
解释一些巫术可能会有所帮助:
daterange()
没有第三个参数会创建一个 half-open 范围——它包括第一个,但不包括最后一个日期。要创建 closed 日期范围,您需要第三个参数 '[]'
。有关详细信息,请参阅 the documentation。
@>
运算符测试右侧的元素是否包含在左侧的区间中。在这种情况下,第一个范围是否包括第二个范围?有关详细信息,请参阅 the documentation。
<em><strong>运算符</strong></em>任意(<em><strong>数组</strong></em>)
将左侧表达式与右侧数组的每个成员进行比较。如果数组的任何元素满足比较,则结果为TRUE
。同样,这里是 documentation link.
我正在尝试使用 PostgreSQL 数组。我添加了一列:
dates date[]
其中包含一个日期数组。我想要 select 行,其中至少有一个日期在一个范围内。
我发现唯一可行的解决方案是:
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';
但这不起作用。
是否有其他方法进行此搜索?
您可以使用这个 WHERE
条件:
WHERE daterange('2021-07-01', '2021-09-30', '[]') @> ANY (dates)
这将测试区间是否包含任何 dates
.
解释一些巫术可能会有所帮助:
daterange()
没有第三个参数会创建一个 half-open 范围——它包括第一个,但不包括最后一个日期。要创建 closed 日期范围,您需要第三个参数'[]'
。有关详细信息,请参阅 the documentation。@>
运算符测试右侧的元素是否包含在左侧的区间中。在这种情况下,第一个范围是否包括第二个范围?有关详细信息,请参阅 the documentation。<em><strong>运算符</strong></em>任意(<em><strong>数组</strong></em>)
将左侧表达式与右侧数组的每个成员进行比较。如果数组的任何元素满足比较,则结果为TRUE
。同样,这里是 documentation link.