这两个postgres表达式给出的结果是否相同?

时间:2019-03-23 09:30:58

标签: postgresql

我有两个具有范围类型的字段。

这两个where表达式会给出相同的结果吗?

where range1 && range2

where not isempty( range1 * range2 )

1 个答案:

答案 0 :(得分:0)

他们会的。
重叠算子(&&)和交点(*)都可以正确评估,包括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