2017-01-08 37 views
1

我正在處理一個表格,對於優秀的設計,列表太多了。 (接近100)。我無法更改架構。Postgres:COALESCE所有列

我需要COALESCE每個列NULL爲0。有沒有辦法做到這一點,而無需手動輸入所有100列? (也許使用某種類型的數據字典或元信息?)

回答

0

您可以創建一個Postgres函數來實現所需的輸出。

示例表和數據 -

create table t(id serial, col1 int, col2 int, col3 int, col4 int, col5 int, col6 int, coln int); 
insert into t values (1, 1, 2, null,null,null,1),(1, null, null, null,2,null,6); 

以下SELECT語句將創建動態select讓所有的表與coalesce()

SELECT format('select %s from t', string_agg(format('coalesce(%s,0)', column_name), ',')) q 
FROM information_schema.columns 
WHERE table_schema = 'public' 
    AND table_name = 't' 

結果:

q                                     
--------------------------------------------------------------------------------------------------------------------------------------------------- 
select coalesce(id,0),coalesce(col1,0),coalesce(col2,0),coalesce(col3,0),coalesce(col4,0),coalesce(col5,0),coalesce(col6,0),coalesce(coln,0) from t 

(1 row(s) affected) 

可以封裝成函數這個

create or replace function get_table_t() 
returns setof t as $$ 
declare qry text; 
begin 
    SELECT format('select %s from t', string_agg(format('coalesce(%s,0)', column_name), ',')) 
    into qry 
    FROM information_schema.columns 
    WHERE table_schema = 'public' 
     AND table_name = 't'; 
    return query 

    execute qry; 
end;$$ 
LANGUAGE plpgsql VOLATILE 

用法:select * from get_table_t()

輸出:

id col1 col2 col3 col4 col5 col6 coln 
-- ---- ---- ---- ---- ---- ---- ---- 
1 1 2 0 0 0 1 0  
1 0 0 0 2 0 6 0