PostgreSQL“IS [NOT] DISTINCT FROM”运算符

时间:2014-01-29 11:51:01

标签: postgresql null comparison-operators gist-index

我们假设一个表:

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 =)

1 个答案:

答案 0 :(得分:1)

a IS NOT DISTINCT FROM b不会使用索引。如初。

所以不,它不存在。

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

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

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