这两个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表达式会给出相同的结果吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这两个指针减法会给出不同的结果?

查询给出错误的结果。知道为啥会这样吗?

为啥这两个高(64bx64b)函数会给出不同的结果?

除以 2 列表达式不给出有效结果

在 Mac 上启动 postgres 服务器

Postgres摘要()与字符串concat和bytea concat的行为不同?