Postgres:COALESCE所有专栏

时间:2017-01-08 18:52:07

标签: postgresql null coalesce

我正在处理一个包含太多列以进行良好设计的表。 (接近100)。我无法改变架构。

我需要在NULL上将每列COALESCE设置为0。有没有办法做到这一点,而无需手工输入所有100列? (也许使用某种类型的数据字典或元信息?)

1 个答案:

答案 0 :(得分: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