【问题标题】:Complex Oracle CASE statement needed需要复杂的 Oracle CASE 语句
【发布时间】:2017-10-23 22:00:06
【问题描述】:

我需要更新给定表中的 20 列。我要使用的值取决于 CASE 语句。目前我有这个长长的声明,看起来像这样:

更新表 X
SET (c1, c2, c3, c4, c5........c20) = (
选择案例
WHEN(某些条件) THEN
ELSE(其他值1)
结束,
案例
WHEN(某些条件) THEN
ELSE(其他值2)
结束,
案例
WHEN(某些条件) THEN
ELSE(其他值3)
结束......

等等。每列的所有 WHEN 条件都是相同的。那么,有没有一种方法可以在 1 个 CASE 语句中编写所有代码,例如:

更新表 X
SET (c1, c2, c3, c4, c5........c20) = (
选择案例
WHEN (某些条件) THEN (value1), (value2), (value3),......
ELSE (value1), (value2), (value3),......
结束…………

从而消除所有重复的 CASE 语句?

还是我坚持使用长版本?

【问题讨论】:

    标签: oracle case-statement


    【解决方案1】:

    我会说它取决于 Value1、Value2、... 和 ValueN。如果它们都是确定性的,那么您可以将它们全部编码在相关子查询中:

    create table TableX (
        ID number primary key
      , exp1 number
      , att1 varchar2(30)
      , att2 varchar2(30)
      );
    
    insert into TableX (
      select 1, 1, 'a','b' from dual union all
      select 2, 2, 'a','b' from dual union all
      select 3, 1, 'a','b' from dual union all
      select 4, 2, 'a','b' from dual
    );
    
    update TableX
      set (att1, att2) = (
    select x.att1, x.att2 
      from (select 1 exp1, 'c' att1,'d' att2 from dual union all
            select 2 exp1, 'x' att1,'y' att2 from dual) x
     where x.exp1 = TableX.exp1
    );
    

    【讨论】:

      【解决方案2】:

      你只是想这样做吗?

      update tablex
      set col1 = val1
           , col2 = val2
           ...
           , col20 = val20
      where (some condition)
      /
      
      update tablex
      set col1 = other1
           , col2 = other2
           ...
           , col20 = other20
      where NOT (some condition)
      /
      

      显然,执行两个更新语句比执行一个更昂贵。但是这个实现更容易理解和维护。那么:你是否犯了过早的优化?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-07
        • 1970-01-01
        • 1970-01-01
        • 2011-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多