使用 Creatinf icase 函数
CREATE OR REPLACE FUNCTION public.icase(
cond1 boolean, res1 anyelement,
cond2 boolean, res2 anyelement,
conddefault anyelement)
RETURNS anyelement LANGUAGE 'sql' IMMUTABLE PARALLEL UNSAFE AS $BODY$
SELECT CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE $5 END;
$BODY$;
select
icase( false, 0, false, 0.,0.)
抛出错误
function icase(boolean, integer, boolean, numeric, numeric) does not exist
如何允许 icase 接受混合整数/数字参数?
根据链接:
https://www.postgresql.org/docs/current/xfunc-sql.html#XFUNC-SQL-多态函数
所以:
运行时会执行:
但正如您所见,它会将输出强制转换为常见的合适类型。
多态类型导致一种通用的、统一的数据类型。将作为 4x相同
Anyelement
类型的占位符,并且如果您传递 3 种不同的东西(第 4 种是结果类型,将根据 3 个参数进行调整),它就会放弃。Anycompatible
不会放弃,而是尝试将 3 种不同的东西转换为一种通用类型(如果可能的话),并且只有一种唯一的方式来转换它们。它将允许您使用混合类型调用例程,但它们最终都会被转换。如果你想要更多的控制权(并计划继续使用 v12),请重载你的函数:
db<>fiddle 上的演示
通过上述 5 个定义,3 个位置上
int
和的 8 种可能组合中的任何一种都可以得到很好的解决:numeric
如果您想在不同的调用之间混合参数类型,而不是在单个调用中,只要您使用显式、统一的类型转换,您的定义就已经起作用了:
demo at db<>fiddle