【发布时间】:2019-05-12 04:53:56
【问题描述】:
我需要从 Oracle 移植一个广泛使用 decode() 的存储过程。也就是说,我不能像guide 所建议的那样使用CASE WHEN expr THEN expr [...] ELSE 系列。
我想创建一个可变参数函数,但问题是:在 Oracle 中,该函数可以接受任意数量的键值对,并且键的类型不一定与值的类型匹配:
select decode(0 ,0,'a' ,1,'b' ,2,'c' /*,...*/ ,'dflt') from dual;
我尝试使用anyarray:
create or replace function decode(VARIADIC args anyarray) RETURNS text AS $$
SELECT null::text;
$$ LANGUAGE SQL;
但这只有在所有参数都属于同一类型时才有效:
select decode(0,0,0); -- ok
select decode('x'::text,'x'::text,'x'::text); -- ok
select decode(0,0,'a'::text); -- No function matches the given name and argument types
如果无法获得所需的语法,请提供另一种传递 expr、对集和默认值的方法,同时保持它们在 Oracle 中的位置。
【问题讨论】:
-
不是答案而是观察
decode是 PostgreSQL system function handling binary string,可能不值得覆盖名称并将其更改为另一个名称,例如:xdecode。 -
我认为即使使用 C 函数也无法模仿 Oracle 的
decode。您必须在应用程序中触摸decodes。 -
我没试过,但是OraFCE声称有Oracle兼容的
decode()函数:github.com/orafce/orafce -
@LaurenzAlbe - C 扩展提供了典型的“any” - 并且可以模拟任何功能 - 不幸的是 - 存在一些性能损失 - 高多少,取决于上下文。跨度>
标签: postgresql polymorphic-functions