1
我正在處理一個表格,對於優秀的設計,列表太多了。 (接近100)。我無法更改架構。Postgres:COALESCE所有列
我需要COALESCE每個列NULL爲0。有沒有辦法做到這一點,而無需手動輸入所有100列? (也許使用某種類型的數據字典或元信息?)
我正在處理一個表格,對於優秀的設計,列表太多了。 (接近100)。我無法更改架構。Postgres:COALESCE所有列
我需要COALESCE每個列NULL爲0。有沒有辦法做到這一點,而無需手動輸入所有100列? (也許使用某種類型的數據字典或元信息?)
您可以創建一個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