大于数组的任何元素

93ze6v8z  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(384)

我面临这个问题:
postgresql中有没有一种方法可以将聚合的时间戳数据放入数组中(例如使用 array_agg 函数),然后在某些条件下执行任何匹配?
我也在做类似的事情 LIKE 在聚合字符串上(使用 string_agg(column,';') ). 但是如何在时间戳上执行类似的操作呢?
所以如果结果是 '{10.10.2021,20.12.2021,1.1.1996}' as timestamp_array 我想过滤至少有一个数组元素的行,在输入之后?
例如, ... WHERE 31.12.2021 > timestamp_array ... 与上面的行不匹配,因为2021年12月31日之后没有数组元素。
但如果我质疑 ... WHERE 31.12.1996 > timestamp_array ... ,将匹配上面的行(因为数组中至少有一个元素在给定的间隔内)。

beq87vna

beq87vna1#

首先,您将使用标准日期格式。然后您可以使用:

where '2021-12-31' > any (timestamp_array)

这里有一把小提琴来说明这个想法。

7rtdyuoh

7rtdyuoh2#

我想筛选至少有一个数组元素在某个输入之后的行?
你可以用 ANY 按建议施工。

WHERE '1996-12-31'::timestamp < ANY ('{2021-10-10, 2021-12-20, 1996-01-01}'::timestamp[])

必须是 < ,不是 > ,显然。
你的“时间戳”看起来很像日期- timestamp input也接受这一点。
但一定要使用推荐的iso8601格式(如演示所示),否则您的输入取决于当前会话的设置。
请参见:
与postgresql中的任何操作符相比
但有可能,有更有效的方法。你说的是“聚合时间戳数据”。通常,在聚合之前进行检查要高效得多。尤其是因为它可以使用索引,而不是您的方法。一般来说, EXISTS 做这个工作。比如:

SELECT ...
FROM   tbl t
WHERE  EXISTS (SELECT FROM tbl t1 WHERE t1.id = t.id AND t1.timestamp_column > '1996-12-31'
GROUP  BY ...

用查询的详细信息开始一个新问题,以获得合适的解决方案。

相关问题