需要复杂的Oracle CASE语句

时间:2017-10-23 22:00:06

标签: oracle case-statement

我需要更新给定表中的20列。我将要使用的值取决于CASE语句。目前我有这样长的陈述,如下所示:

更新表X
SET(c1,c2,c3,c4,c5 ........ c20)=(
  选择案例
           什么时候(某些条件)那么            ELSE(其他值1)
         END,
         CASE
           什么时候(某些条件)那么            ELSE(其他值2)
         END,
         CASE
           什么时候(某些条件)那么            ELSE(其他值3)
         END .............

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

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

因此消除了所有重复的CASE陈述?

还是我坚持使用长版?

2 个答案:

答案 0 :(得分:0)

我说它取决于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
);

答案 1 :(得分:0)

你只是想这样做吗?

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)
/

显然,两个更新语句的执行成本比一个更高。但是这种实现更容易理解和维护。那么:你是否因过早优化而感到内疚?