这两个postgres表达式会给出相同的结果吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这两个postgres表达式会给出相同的结果吗?相关的知识,希望对你有一定的参考价值。
我有两个范围类型的字段。
这两个where
表达式会给出相同的结果吗?
where range1 && range2
where not isempty( range1 * range2 )
答案
他们确实会。
正确评估重叠运算符(&&
)和交集(*
),包括2个范围具有公共边界及其交集的情况:
- 只包含1个元素(=两者都包含了绑定)
- 不包含任何元素(=绑定不包含在2个范围中的至少1个)
以下查询几乎测试了所有情况(=交叉点超过1点,正好1点,0点但是“关闭”,“真正”0点,以及下限/上限包含的所有组合):
WITH r(range) AS (
VALUES (numrange(0,1,'[]')), (numrange(1,2,'[]')), (numrange(0,2,'[]')), (numrange(5,6, '[]')),
(numrange(0,1,'[)')), (numrange(1,2,'[)')), (numrange(0,2,'[)')), (numrange(5,6, '[)')),
(numrange(0,1,'(]')), (numrange(1,2,'(]')), (numrange(0,2,'(]')), (numrange(5,6, '(]')),
(numrange(0,1,'()')), (numrange(1,2,'()')), (numrange(0,2,'()')), (numrange(5,6, '()'))
)
SELECT * FROM (
SELECT r1.range, r2.range, r1.range && r2.range AS UsingOverlap, NOT isempty(r1.range * r2.range) AS UsingIntersect
FROM r r1, r r2
) T
随意添加WHERE UsingOverlap <> UsingIntersect
。
以上是关于这两个postgres表达式会给出相同的结果吗?的主要内容,如果未能解决你的问题,请参考以下文章