PostgreSQL";与“不”不同;操作人员

PostgreSQL";与“不”不同;操作人员,postgresql,null,comparison-operators,gist-index,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”值的“range”值重叠。但我希望它像对

让我们假设一张桌子:

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”值的“range”值重叠。但我希望它像对待其他值一样对待“NULL”(因此,对于barid=NULL的不同记录,不允许重叠范围)。因此,给定a=NULL和b=NULL,我希望实现“a与b没有区别”类型的行为,而不是“a=b”类型的行为(如上所述)。是否存在这样的运营商?目前,我只能通过使用

EXCLUDE USING gist (range WITH &&, COALESCE(barid, -1) WITH =)

a与b没有区别
不会使用索引。永远

所以不,它不存在

旁白:空在关系代数中表示未定义或未知。它,作为特殊的价值,实际上不是一个,因为不适用

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

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