2017-05-05 6 views
-1

예를 들어 테이블의 각 행에 대해 null 필드를 계산하려고합니다.전체 행을 가져 오는 PostgreSQL 함수를 구현하는 방법은 무엇입니까?

어떤 인수 유형 선언을 사용해야합니까?

CREATE FUNCTION count_null (row my_table) 
    RETURNS INTEGER 
AS $$ 
    return len([x for x in row if x is None]) 
$$ LANGUAGE plpythonu; 

하지만 그것을 호출하는 경우는 같은 인수 유형과 일치하지 않습니다 :

SELECT count_null(*) FROM my_table; 

답변

1

당신이> 포스트 그레스를 사용하는 가정

나는 (유형으로 테이블 이름) 복합 형 시도 = 9.3이면 다음과 같이 json 변환을 사용하여이를 수행 할 수 있습니다.

create or replace function count_null(
    _r json 
) returns integer as $$ 
    select 
     count(1)::integer 
    from 
     (
      select 
       row_to_json(json_each(_r)) as condensed_record 
     ) as __base 
    where 
     condensed_record->>'value' is null; 
$$ language sql immutable; 

--------- 

select 
    count_null(row_to_json(my_table)) 
from 
    my_table; 

이것은 langua ge plorkthon보다는 SQL을 사용하므로 쿼리 플래너는 어느 정도 최적화 할 수 있습니다.