2017-05-05 41 views
-1

例如,我想爲表中的每一行計算空字段。如何實現獲取整行的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

假設你正在使用的Postgres> = 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 SQL而不是plpythonu,所以查詢規劃器可以在一定程度上對其進行優化。