我真的想知道为什么IF (previous_foo IS NOT NULL)
条件在下面失败,因为将此行更改为IF (previous_foo.total IS NOT NULL)
评估为true。
CREATE OR REPLACE FUNCTION foo_total(the_bar bar)
RETURNS numeric
LANGUAGE plpgsql
STABLE
AS $$
DECALRE
previous_foo foo;
BEGIN
previous_foo := foo_previous(the_bar);
IF (previous_foo IS NOT NULL) THEN -- fails
-- IF (previous_foo.total IS NOT NULL) -- works
return previous_foo.total;
END IF;
RETURN NULL;
END;
$$;
那么previous_foo
如何为空,但previous_foo.total
不为空:/
以前的foo正在做类似这样的事情
create or replace function previous_foo(the_bar bar) returns foo
LANGUAGE sql STABLE
AS $$
SELECT foo.* FROM foo
WHERE -- conditions;
$$;
答案 0 :(得分:1)
这符合the documentation和SQL标准:
如果表达式是行值,那么当行表达式本身为空或所有行的字段为空时,IS NULL为真,而当IS NOT NULL为真时行表达式本身是非空的,并且所有行的字段都是非空的。
必须是复合中的某些字段为NULL。
对于NULL来说,这不是标准委员会唯一的奇怪裁决......