这是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;
我面临的问题
当我在这里传递Input参数时,我得到0 count
tot_cnt int := (select count(*) from information_schema.columns where table_name = ' || tbl_nm || ');'
为了测试的目的,我尝试硬编码表名在过程中,我得到错误亚马逊无效操作:值为域information_schema。cardinal_number违反检查约束"cardinal_number_domain_check">
这在红移中是可能的吗,我怎么做这个逻辑或任何其他的解决方案。
需要专家建议这里!!
您可以简单地使用NVL(cn_nm,0)
函数在表上运行UPDATE
UPDATE tbl_raw
SET col2 = NVL(col2,0);
然而,UPDATE
是一个相当昂贵的操作。考虑只在表上使用一个视图来包装NVL(cn_nm,0)
CREATE VIEW tbl_clean
AS
SELECT col1
, NVL(col2,0) col2
FROM tbl_raw;