Postgres返回行失败不为null

时间:2017-10-26 22:29:30

标签: postgresql

我真的想知道为什么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;
$$;

1 个答案:

答案 0 :(得分:1)

这符合the documentation和SQL标准:

  

如果表达式是行值,那么当行表达式本身为空或所有行的字段为空时,IS NULL为真,而当IS NOT NULL为真时行表达式本身是非空的,并且所有行的字段都是非空的。

必须是复合中的某些字段为NULL。

对于NULL来说,这不是标准委员会唯一的奇怪裁决......