PostgreSQL实现Oracle的decode函数功能

PostgreSQL实现Oracle的decode函数功能

相关链接:https://blog.csdn.net/weixin_34242509/article/details/92974392

create or replace function decode(variadic p_decode_list text[])

returns text

 as

$$

declare

 -- 获取数组长度(即入参个数)

 v_len integer := array_length(p_decode_list, 1);

 -- 声明存放返回值的变量

 v_ret text;

begin

 /*

 * 功能说明:模拟Oracle中的DECODE功能(字符串处理, 其它格式可以自行转换返回值)

 * 参数说明:格式同Oracle相同,至少三个参数

 * 实现原理: 1、VARIADIC 允许变参; 2、Oracle中的DECODE是拿第一个数依次和之后的偶数位值进行比较,相同则取偶数位+1的数值,否则取最后一位值(最后一位为偶数为,否则为null)

 */

 

 -- 同Oracle相同当参数不足三个抛出异常

 if v_len >= 3 then

  -- Oracle中的DECODE是拿第一个数依次和之后的偶数位值进行比较,相同则取偶数位+1的数值

  for i in 2..(v_len - 1) loop

   v_ret := null;

   if mod(i, 2) = 0 then

    if p_decode_list[1] = p_decode_list[i] then

     v_ret := p_decode_list[i+1];

    elsif p_decode_list[1] <> p_decode_list[i] then

     if v_len = i + 2 and v_len > 3 then

      v_ret := p_decode_list[v_len];

     end if;

    end if;

   end if;

   exit when v_ret is not null;

  end loop;

 else

  raise exception 'UPG-00938: not enough args for function.';

 end if;

 return v_ret;

end;

$$

 language plpgsql;

 

 

-- 测试1

select decode('_a','_aa', 'x') a3,

       decode('_a','_aa', 'x', 's') a4,

       decode('_a', '_aa', 'x', '_b', 's') a5,

       decode('_b', '_aa', 'x', '_b', 's') a5,

       decode('_a', '_aa', 'x', '_b', 's', 'o', 'x', 'tt') a6;

-- 测试2

with xx as

(

 select 'M' sex

 union all

 select 'F' sex

 union all

 select 'X' sex

 union all

 select 'Z' sex

 union all

 select '' sex

)

select sex, decode(sex, 'M', '男', 'F', '女', decode(sex, 'X', '变性', '其它')) from xx;

  1. create or replace function decode(variadic p_decode_list text[])
  2.   returns text
  3.    as
  4.   $$
  5.   declare
  6.    -- 获取数组长度(即入参个数)
  7.    v_len integer := array_length(p_decode_list, 1);
  8.    -- 声明存放返回值的变量
  9.    v_ret text;
  10.   begin
  11.    /*
  12.    * 功能说明:模拟Oracle中的DECODE功能(字符串处理, 其它格式可以自行转换返回值)
  13.    * 参数说明:格式同Oracle相同,至少三个参数
  14.    * 实现原理: 1、VARIADIC 允许变参; 2、Oracle中的DECODE是拿第一个数依次和之后的偶数位值进行比较,相同则取偶数位+1的数值,否则取最后一位值(最后一位为偶数为,否则为null)
  15.    */
  16.    
  17.    -- 同Oracle相同当参数不足三个抛出异常
  18.    if v_len >= 3 then
  19.     -- Oracle中的DECODE是拿第一个数依次和之后的偶数位值进行比较,相同则取偶数位+1的数值
  20.     for i in 2..(v_len - 1) loop
  21.      v_ret := null;
  22.      if mod(i, 2) = 0 then
  23.       if p_decode_list[1] = p_decode_list[i] then
  24.        v_ret := p_decode_list[i+1];
  25.       elsif p_decode_list[1] <> p_decode_list[i] then
  26.        if v_len = i + 2 and v_len > 3 then
  27.         v_ret := p_decode_list[v_len];
  28.        end if;
  29.       end if;
  30.      end if;
  31.      exit when v_ret is not null;
  32.     end loop;
  33.    else
  34.     raise exception 'UPG-00938: not enough args for function.';
  35.    end if;
  36.    return v_ret;
  37.   end;
  38.   $$
  39.    language plpgsql;
  40.    
  41.    
  42.    
  43.    
  44.   -- 测试1
  45.   select decode('_a','_aa', 'x') a3,
  46.          decode('_a','_aa', 'x', 's') a4,
  47.          decode('_a', '_aa', 'x', '_b', 's') a5,
  48.          decode('_b', '_aa', 'x', '_b', 's') a5,
  49.          decode('_a', '_aa', 'x', '_b', 's', 'o', 'x', 'tt') a6;
  50.   -- 测试2
  51.   with xx as
  52.   (
  53.    select 'M' sex
  54.    union all
  55.    select 'F' sex
  56.    union all
  57.    select 'X' sex
  58.    union all
  59.    select 'Z' sex
  60.    union all
  61.    select '' sex
  62.   )
  63.   select sex, decode(sex, 'M', '男', 'F', '女', decode(sex, 'X', '变性', '其它')) from xx;
上一篇:redis操作


下一篇:Python--编码转换