我正在处理一个包含太多列以进行良好设计的表。 (接近100)。我无法改变架构。
我需要在NULL上将每列COALESCE设置为0。有没有办法做到这一点,而无需手工输入所有100列? (也许使用某种类型的数据字典或元信息?)
答案 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