在红移中动态地将Null列更新为零



这是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;

相关内容

  • 没有找到相关文章

最新更新