Amazon redshift 在红移中将空列动态更新为零

Amazon redshift 在红移中将空列动态更新为零,amazon-redshift,plpgsql,dynamic-sql,Amazon Redshift,Plpgsql,Dynamic Sql,这是SAS中的代码,它查找空白的数字列并替换为0 DATA dummy_table; SET dummy_table; ARRAY DUMMY _NUMERIC_; DO OVER DUMMY; IF DUMMY=. THEN DUMMY=0; END; RUN; 我试图在红移中复制这个,这是我尝试的 create or replace procedure sp_replace_null_to_zero(IN tbl_nm varchar) as $$ Begin Execute 'de

这是SAS中的代码,它查找空白的数字列并替换为0

DATA dummy_table;
SET dummy_table;
ARRAY DUMMY _NUMERIC_;
DO OVER DUMMY;
  IF DUMMY=. THEN DUMMY=0;
END;
RUN;
我试图在红移中复制这个,这是我尝试的

create or replace procedure sp_replace_null_to_zero(IN tbl_nm varchar) as $$
Begin

Execute 'declare ' ||
            'tot_cnt int := (select count(*)  from information_schema.columns where table_name = ' || tbl_nm || ');' ||
            'init_loop int := 0; ' ||
            'cn_nm varchar; ' 
  
Begin
  While init_loop <= tot_cnt    
  Loop
  Raise info 'init_loop = %', Init_loop; 
  Raise info 'tot_cnt = %', tot_cnt; 
  
  Execute 'Select column_name into cn_nm from information_schema.columns ' ||
  'where table_name ='|| tbl_nm || ' and ordinal_position = init_loop ' ||
  'and data_type not in (''character varying'',''date'',''text''); '
  
  Raise info 'cn_nm = %', cn_nm;  
  
    if cn_nm is not null then
      Execute 'Update ' || tbl_nm ||
              'Set ' || cn_nm = 0 ||
              'Where ' || cn_nm is null or cn_nm =' ';
    end if;
 init_loop = init_loop + 1;
 end loop;             
End;  
End;
$$ language plpgsql;
出于测试目的,我尝试在proc内硬编码表名,但得到错误amazon无效操作:域信息\u架构的值。基数\u编号违反检查约束“基数\u编号\u域\u检查”

这在红移中是否可能,我如何做这个逻辑或任何其他解决方法


这里需要专家建议

您只需使用
NVL(cn\u nm,0)
功能在表上运行
更新

更新tbl\u原始
设置col2=NVL(col2,0);
然而,
UPDATE
是一项相当昂贵的操作。考虑只使用表上的视图来包装<代码> NVL(CNNM NM,0)< /COD> < /P>中的列。
创建视图待清理
作为
选择col1
,NVL(col2,0)col2
来自tbl_原料;

如果不完全重写函数,代码中的错误太多,无法给出答案。回答标题中的问题:在表上插入触发器之前使用,或者存储空值,并在选择时将其转换为0。这就是我所做的更新,我之所以这样做是因为我有40多列是为了建模而创建的。一次更新40多列比一次更新一列更快。红移中的更新将重写整个更新行。
tot_cnt int := (select count(*) from information_schema.columns where table_name = ' || tbl_nm || ');'