createorreplacefunctiondecode (variadicp _ decode _ listtext [ ] ) )
返回文本
as
$$
declare
-获取数组的长度或参数数量
v _ len integer :=array _ length (p _ decode _ list,1 );
-声明包含返回值的变量
v_rettext;
比根
/*
*功能说明3360模拟Oracle的解码功能(字符串处理,其他形式可以自行转换返回值) )
*参数说明:格式与Oracle相同,至少有三个参数
*实现原理:一、VARIADIC允许变量; 二、Oracle中的DECODE将第一个数依次与以后的偶数位的值进行比较,如果相同,则取偶数位1的数值。 否则,取最后一位的值。 (最后一位是偶数,否则为空。 )
*/
如果与Oracle相同的参数小于3,则抛出异常
ifv_len=3then
--Oracle的DECODE从最初数开始按顺序与后面的偶数位的值进行比较,如果相同,则取偶数位1的值
foriin2.(v_len-1 ) loop
v_ret:=null;
ifmod(I,2 )=0then
ifp _ decode _ list [1]=p _ decode _ list [ I ] then
v_ret:=p_decode_list[i 1];
elsifp _ decode _ list [1] p _ decode _ list [ I ] then
ifv_len=i 2andv_len3then
v _ ret :=p _ decode _ list [ v _ len ];
endif;
endif;
endif;
exitwhenv_retisnotnull;
结束环路;
else
raise exception ' upg-00938: notenoughargsforfunction.';
endif;
returnv_ret;
结束;
$$
语言plpgsql;
-测试1
选择代码(' _ a '、' _aa '、' x ' ) a3,
ecode () _a、(_aa )、() x )、(s ) ) a4,
ecode () _a )、((_aa )、() x )、) _b )、() s ) ) a5
ecode(b )、aa )、x )、b )、s ) a5,
ecode () a )、aa )、x )、b )、s )、o )、x )、tt ) a6;
-测试2
withxxas
(
选择' m ' sex
全部合并
选择' f ' sex
全部合并
选择x ' sex
全部合并
选择' z ' sex
全部合并
选择“”sex
)
selectsex,decode(sex,' m ','男人',' f ','女人',decode ) sex,' x ','变性','其他') fromxx;