SAS到PostgreSQL(PADB)代码-求和字段(如果存在)

时间:2018-08-29 14:28:17

标签: postgresql postgresql-8.0

我需要处理来自SAS的一段代码,我需要将这些代码转换为SQL。 通常,我很擅长此事,但是对,我不是一个新挑战,到目前为止,我解决这个问题的所有想法都失败了,而且我没有找到正确的方法。

我需要能够为该请求动态地提取字段,就像某个字段的名称中具有特定模式一样,我需要对这些字段求和。

我的PostgreSQL版本是8.0.2,PADB 5.3.3.1 78560

因此该表可能有也可能没有bas_txn_03cibc_vcl之类的字段。

我编写了一个函数,当在information_schema表中未找到该字段时,应输出' ' as bas_txn_03cibc_vcl,并使用bas_txn_03cibc_vcl

但是,当我执行命令时,出现错误,即UDF无法在PADB表上使用。

  

“错误:XX000:用户定义的SQL语言函数“ check_if_field_exists(字符不同,字符不同,字符不同)”不能在引用PADB表的查询中使用。”

现在,我正在使用存储过程构建一种新方法,但是它将限制用例。关于如何动态选择字段还有其他想法吗?

功能:

CREATE OR REPLACE FUNCTION check_if_field_exists(_schm text, _tbl text, _field text)
RETURNS text AS
$BODY$
DECLARE 
    _output_ text:=  '' as _field;
BEGIN 
EXECUTE   'SELECT column_name into : _output_ FROM rdwaeprd.information_schema.columns 
where table_schema='''|| _schm||'''   
and table_name='''|| _tbl||'''   
and column_name='''|| _field||'''   
order by table_name,column_name;';  
RETURN _output_;
END
$BODY$
LANGUAGE PLPGSQL;

然后我会这样使用它

select indiv_id,ae_psamson.check_if_field_exists('ae_psamson','activ_cc', 'tot_txn_03AMX_AMXE') ,tot_txn_03AMX_AMXD
from activ_cc
group by indiv_id,tot_txn_03AMX_AMXD;

该函数将返回''作为tot_txn_03AMX_AMXE或简单地返回tot_txn_03AMX_AMXE ....的主意是使该字段不存在时查询不返回错误。

就像我说过的那样,我需要一种新功能或新方法...

1 个答案:

答案 0 :(得分:0)

我设法制作了一个使它起作用的功能! 基本上,问题之一就是该信息模式在UDF中使用了不受支持的功能。 此解决方案效果很好:

CREATE OR REPLACE FUNCTION check_if_field_exists(_schm text, _tbl text, _field text)
RETURNS varchar(55)  AS
$BODY$
DECLARE 
    _output_ varchar(55) :=' 0 as '|| _field;
--  name := (SELECT t.name from test_table t where t.id = x);
BEGIN 
EXECUTE  'drop table if exists col_name';
EXECUTE  'create table col_name as SELECT att.attname::character varying(128) AS colname   
FROM pg_class cl, pg_namespace ns, pg_attribute att 
WHERE cl.relnamespace = ns.oid AND cl.oid = att.attrelid AND ns.nspname='''|| _schm ||''' 
and cl.relname='''|| _tbl ||''' 
and colname like '''|| _field||''''; -- INTO _output_;
select colname from col_name into _output_ ;  
if _output_ is null then 
_output_  :=' 0 as '|| _field;
end if;
RETURN _output_  ;
END 
$BODY$
LANGUAGE PLPGSQL;