【问题标题】:PostgreSQL "IS [NOT] DISTINCT FROM" operatorPostgreSQL "IS [NOT] DISTINCT FROM" 运算符
【发布时间】:2014-02-21 05:03:14
【问题描述】:

假设有一张桌子:

CREATE TABLE foo (
  id serial primary key
  , range int4range NOT NULL
  , barid integer references bar(id)
  , baz whatever... NOT NULL
  , EXCLUDE USING gist (range WITH &&, barid WITH =)
);

排除约束应该不允许相同“barid”值的重叠“范围”值。但我希望它像其他值一样对待“NULL”(因此不允许具有 barid = NULL 的不同记录的重叠猪范围)。所以给定 a = NULL 和 b = NULL,我想实现“a IS NOT DISTINCT FROM b”类型的行为,而不是“a = b”行为(如here 所述)。这样的运营商存在吗?目前我只能通过使用

来实现这一点
EXCLUDE USING gist (range WITH &&, COALESCE(barid, -1) WITH =)

【问题讨论】:

    标签: postgresql null comparison-operators gist-index


    【解决方案1】:

    a IS NOT DISTINCT FROM b 不会使用索引。永远。

    所以不,它不存在。

    除此之外:关系代数中的 null 表示未定义或未知。它does not mean no value,作为特殊值实际上不是一个,因为不适用。

    如果您希望 null 表示后者,请将其设为非 null 并为“无值”项分配特殊值,例如0 或 -1。并将这个特殊值也添加到您的引用表中。

    这样您就可以使用现有的约束。

    【讨论】:

      猜你喜欢
      • 2012-05-12
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 2023-01-31
      相关资源
      最近更新 更多