我可以在UPDATE语句中使用DECODE吗?

时间:2011-03-04 11:58:06

标签: plsql

我可以在SET左侧的UPDATE语句中使用DECODE吗?

UPDATE temp SET DECODE(update_var,1,col1,                              2,col2)= update_value;

这给了我错误,因为忽略了一些符号。

3 个答案:

答案 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语句或立即执行的解决方案可能更适合您的问题。