我可以在SET左侧的UPDATE语句中使用DECODE吗?
UPDATE temp SET DECODE(update_var,1,col1, 2,col2)= update_value;
这给了我错误,因为忽略了一些符号。
答案 0 :(得分:14)
这个怎么样?如果更新标志设置为1,则更新col1,如果设置为2,则更新col2。
UPDATE temp
SET col1 = DECODE(update_var, 1, update_value, col1),
col2 = DECODE(update_var, 2, update_value, col2)
另外,作为奖励,它会处理更新变量设置为一个或两个以外的可能情况!
答案 1 :(得分:2)
不,你不能那样做。您可以在PL / SQL中执行此操作:
IF update_var = 1 THEN
UPDATE temp SET col1 = update_value;
else
UPDATE temp SET col2 = update_value;
END IF;
或者您可以像这样使用动态SQL:
l_sql := 'UPDATE temp SET col'||update_var||' = :v';
EXECUTE IMMEDIATE l_sql USING update_value;
答案 2 :(得分:1)
您无法在更新语句中使用decode。 但是,您可以使用合并声明。
http://psoug.org/reference/merge.html
MERGE INTO temp b
USING (
SELECT key, DECODE(update_var, 1, update_value, col1) as col1,
DECODE(update_var, 2, update_value, col2) as col2
FROM temp
WHERE key =theKeyIPassedIn) e
ON (b.key = e.key)
WHEN MATCHED THEN
UPDATE SET b.col1 = e.col1, b.col2 = e.col2
;
基本上,您使用合并的选择部分将col1和col2解码为update_value或已存在的值。
对于您的需求而言,这也可能过于冗长,使用if语句或立即执行的解决方案可能更适合您的问题。