PostgreSQL 9.4 - 比较NULL值

los*_*rse 8 postgresql postgresql-9.4

在正常情况下,将NULL值与任何其他值进行比较会产生另一个NULL值.

SELECT NULL = NULL;
Run Code Online (Sandbox Code Playgroud)

返回 NULL


在比较任意行时,这(大多数情况下)是正确的,如文档9.23.5中所述.行构造函数比较:

SELECT ROW(1, NULL, 'baz text') = ROW(1, NULL, 'baz text'); 
Run Code Online (Sandbox Code Playgroud)

返回 NULL


但是,在比较定义良好的复合类型时,NULL值被视为相等.

CREATE TYPE test_type AS (
    foo INTEGER,
    bar BIGINT,
    baz TEXT
);

SELECT (1, NULL, 'baz text')::test_type = (1, NULL, 'baz text')::test_type;
Run Code Online (Sandbox Code Playgroud)

返回 TRUE

这种行为似乎没有记录(我看过并发现没有对行为的引用).

我想使用此行为来实现一些业务规则,并希望确保这样做是安全的.

  1. 这与任何SQL规范一致吗?
  2. 可能会在未来发生变化吗?

Zig*_*ter 4

我在官方文档中发现了这一点:[...] 在比较两个复合类型值的其他上下文中,两个 NULL 字段值被认为是相等的,并且 NULL 被认为大于非 NULL。为了使复合类型具有一致的排序和索引行为,这是必要的。。我想这可以解决你的问题。