2017-10-26 1 views
2

IF (previous_foo.total IS NOT NULL)으로 변경하면 true가 평가되는 이유에서 IF (previous_foo IS NOT NULL) 조건이 아래에서 실패하는 이유를 알고 싶습니다. Postgres가 반환 한 행이 null이 아닙니다.

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 널 (null) 일 수있다, 그러나 previous_foo.total가 null이 될 수 없습니다 :/

이전 foo는이 같은 일을하고있다 참고

create or replace function previous_foo(the_bar bar) returns foo 
    LANGUAGE sql STABLE 
    AS $$ 
     SELECT foo.* FROM foo 
     WHERE -- conditions; 
$$; 

답변

1

the documentation과 SQL 표준을 준수한다 :

표현식이 행 - 값이면, 행 표현 자체가 널이거나 모든 행의 필드가 널인 경우 IS NULL이 참인 반면, 행 표현 자체가 널이 아니고 모든 행의 필드가 비 - 없는.

컴포지트의 일부 필드가 NULL이어야합니다.

이것은 NULL & hellip과 관련하여 표준위원회의 유일한 이상한 판결은 아닙니다.

+0

감사합니다. 그렇습니다. 이것은 "감각적"입니다. 해당 행의 일부 필드는 null입니다. – Tim

관련 문제