当范围使用“infinity”作为显式上边界时,为什么“upper_inf”返回 false?

问题描述 投票:0回答:1

PostgreSQL范围文档建议神奇时间戳

infinity
应该与省略边界值相同:

具有“无穷大”概念的元素类型可以将它们用作显式绑定值。例如,对于时间戳范围,

[today,infinity)
排除特殊时间戳值无穷大,而
[today,infinity]
包括它,
[today,)
[today,]
也是如此。

函数 lower_inf 和 upper_inf 分别测试范围的无限下限和上限。

然而,当使用

upper_inf
测试范围(或多范围)是否包含无穷大时,当
infinity
到位时,结果始终为 false:

SELECT * FROM (
    SELECT 1 AS test, upper_inf('{(,)}'::tstzmultirange)
    UNION SELECT 2, upper_inf('{(,infinity)}'::tstzmultirange)
    UNION SELECT 3, upper_inf('{(,]}'::tstzmultirange)
    UNION SELECT 4, upper_inf('{(,infinity]}'::tstzmultirange)
    UNION SELECT 5, upper_inf('(,)'::tstzrange)
    UNION SELECT 6, upper_inf('(,infinity)'::tstzrange)
    UNION SELECT 7, upper_inf('(,]'::tstzrange)
    UNION SELECT 8, upper_inf('(,infinity]'::tstzrange)
) AS cases ORDER BY test;

产品:

1   true
2   false
3   true
4   false
5   true
6   false
7   true
8   false

为什么?

postgresql range infinity
1个回答
0
投票

Adrian Klaver正确指出了我错过的文档的另一部分:

upper_inf ( anyrange ) → boolean
Does the range have no upper bound? (An upper bound of Infinity returns false.)
upper_inf('(,)'::daterange) → t

因此,

upper_inf
测试是否显式设置了上限,而不是测试界限是什么。

Infinity 的意思是“无限”,所以上限(值)不存在,但是“时间戳”将无穷大定义为它的上限,所以从技术上来说,上限是存在的。

© www.soinside.com 2019 - 2024. All rights reserved.