null值和所有列为null的行类型之间是否有任何区别? Postgres查询似乎能够区分(显示空列而不是空白),我想知道是否有任何我应该注意的事项。 e.g。
CREATE TYPE node AS (
rank integer
, id integer
);
CREATE TABLE hierarchy (
node node
);
INSERT INTO hierarchy (node) VALUES (null);
INSERT INTO hierarchy (node) VALUES ((null, null));
SELECT *, node IS NULL AS check_null FROM hierarchy;
node | check_null ------+------------ | t (,) | t
答案 0 :(得分:4)
null值和所有列都为null的rowtype之间有什么区别吗?
NULL:node
仍然与(null, null)::node
不同:
SELECT null::node IS DISTINCT FROM (null, null)::node AS dist;
dist ---- t
我同意这令人困惑。还有the manual might be sharpened here:
对于非空输入,
IS DISTINCT FROM
与<>
运算符相同。 但是,如果两个输入都为null,则返回false,如果只有一个 input为null,返回true。
面对上面的演示,结果有点不正确。即使有进一步的暗示:
如果
expression
是行值,则行IS NULL
为真 表达式本身为null或者所有行的字段都为空。
所以我们有两个不同的情况,其中行值为null:
应该提到的是,与IS DISTINCT FROM
相比,这两种情况仍被视为 不同 。可能值得一个文档错误报告...
我应该注意什么?
是。无论DISTINCT
发挥作用,两种变体都被认为是完全不同的:
SELECT DISTINCT * FROM hierarchy;
node1 ------ (,) (2 rows)
注意第二个不可见的行,因为psql以这种方式显示空值。
停止(,)案例发生?
发表评论:
CREATE TABLE hierarchy (
node node CHECK (node IS DISTINCT FROM (null, null)::node)
);
注意两件事:
(null, null)::node
是必要的。