我需要处理来自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 ....的主意是使该字段不存在时查询不返回错误。
就像我说过的那样,我需要一种新功能或新方法...
答案 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;