Amazon redshift 在红移中将空列动态更新为零
这是SAS中的代码,它查找空白的数字列并替换为0Amazon 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
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 || ');'