lsjweiyi 2023-06-14 12:11 采纳率: 100%
浏览 14
已结题

oracle 计算值多处地方decode做判断该如何优化

oracle 中,我有一个字段(名字叫 ‘输出参数’)的构造形如:“1|23|42323|阿斯达|4252额|安达安达a|安达a”,它使用“|”拼接的,长度挺长。
其中有几个我想取的值,由于他位置会变,但是有一定规律:

--rh_split是我自定义的分割函数,表示取第一个字符串。在这里并不重要。
总费用=rh_split(a.输出参数, '|', 31) + rh_split(a.输出参数, '|', 32)

而我好几个想取的数,都跟这个规律相关,于是我写出了如下代码:

select decode(rh_split(a.输出参数, '|', 31) + rh_split(a.输出参数, '|', 32),
              a.总费用,
              rh_split(a.输出参数, '|', 30),
              rh_split(a.输出参数, '|', 31)) as 费用A,
              
       decode(rh_split(a.输出参数, '|', 31) + rh_split(a.输出参数, '|', 32),
              a.总费用,
              rh_split(a.输出参数, '|', 31),
              rh_split(a.输出参数, '|', 32)) as 费用B,
              
       decode(rh_split(a.输出参数, '|', 31) + rh_split(a.输出参数, '|', 32),
              a.总费用,
              rh_split(a.输出参数, '|', 32),
              rh_split(a.输出参数, '|', 33)) as 费用C,
              
       decode(rh_split(a.输出参数, '|', 31) + rh_split(a.输出参数, '|', 32),
              a.总费用,
              rh_split(a.输出参数, '|', 33),
              rh_split(a.输出参数, '|', 34)) as 费用D
  from tableName a

就是用decode 重复判断这个规律,看起来就很复杂,这种情况能优化吗?这样的代码又长又臭,而且可能同一个值要计算好几次?

  • 写回答

1条回答 默认 最新

  • AllenGd 领域专家: 大数据技术领域 2023-06-14 15:03
    关注
    
    WITH split_params AS (
    SELECT
        a.总费用,
        rh_split ( a.输出参数, '|', 30 ) AS 费用 A_1,
        rh_split ( a.输出参数, '|', 31 ) AS 费用 A_2,
        rh_split ( a.输出参数, '|', 32 ) AS 费用 B_1,
        rh_split ( a.输出参数, '|', 33 ) AS 费用 C_1,
        rh_split ( a.输出参数, '|', 34 ) AS 费用 D_1 
    FROM
        tableName a 
        ) 
    SELECT
    CASE
        WHEN
        费用 A_2 + 费用 B_1 = 总费用 THEN
        费用 A_1 ELSE 费用 A_2 
    END AS 费用 A,
    CASE
        WHEN 
        费用 A_2 + 费用 B_1 = 总费用 THEN
        费用 A_2 ELSE 费用 B_1 
        END AS 费用 B,
    CASE
        WHEN 
        费用 A_2 + 费用 B_1 = 总费用 THEN
        费用 B_1 ELSE 费用 C_1 
        END AS 费用 C,
    CASE
        WHEN 
        费用 A_2 + 费用 B_1 = 总费用 THEN
        费用 C_1 ELSE 费用 D_1 
        END AS 费用 D 
    FROM
    split_params;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月26日
  • 已采纳回答 6月18日
  • 创建了问题 6月14日