我需要更新给定表中的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陈述?
还是我坚持使用长版?
答案 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)
/
显然,两个更新语句的执行成本比一个更高。但是这种实现更容易理解和维护。那么:你是否因过早优化而感到内疚?