我在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....这个想法是使查询在字段不存在时不返回错误。
就像我说的,我需要一个新的功能或方法,因为这个不起作用......
我设法制作了一个使其工作的函数! 基本上,该信息模式在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;