Sql 使用Case更新多列

Sql 使用Case更新多列,sql,oracle,query-performance,Sql,Oracle,Query Performance,我有一个如下所示的查询: UPDATE some_table SET column_x = CASE WHEN x_specific_condition THEN new_value_for_x ELSE column_x END, column_y = CASE WHEN y_specific_condition THEN new_value_for_y ELSE column_y END, WHERE some_more_conditions 上面的问题是,如果某些条件返回tru

我有一个如下所示的查询:

UPDATE some_table
SET column_x = CASE WHEN x_specific_condition THEN new_value_for_x ELSE column_x END,
    column_y = CASE WHEN y_specific_condition THEN new_value_for_y ELSE column_y END, 
WHERE some_more_conditions
上面的问题是,如果某些条件返回true,而不管它们的特定条件返回true,则每列(x,y)仍然会用它们自己的值进行更新。我试着从上面移走其他东西,但没有成功

由于两种情况下的某些条件相同,所以我将进行组合,我认为最好执行“一体式更新”(欢迎建议)


您知道有没有一种方法可以在1个查询中执行上述更新,即跳过特定条件不匹配的各个列(基本上避免覆盖相同的值)

要在一次更新中执行此操作,您需要展开
where
子句:

UPDATE some_table
    SET column_x = CASE WHEN x_specific_condition THEN new_value_for_x ELSE column_x END,
        column_y = CASE WHEN y_specific_condition THEN new_value_for_y ELSE column_y END, 
    WHERE some_more_conditions AND
          (x_specific_condition OR
           y_specific_condition
          );
另一种方法是使用多个更新,但这可能会更昂贵:

UPDATE some_table
    SET column_x = new_value_for_x
    WHERE some_more_conditions AND x_specific_condition;

UPDATE some_table
    SET column_y = new_value_for_y
    WHERE some_more_conditions AND y_specific_condition;

关于第一种方法,我考虑过,问题是,假设x_-specific_条件为真,y_-specific_条件为假,在这种情况下,仍然会将列_-y更新为它自己的值。我们不能完全省略那部分吗。第二种方法我理解,但我想避免成本(这是这个问题的主要原因:-)@RachitJain。这其实没什么大不了的。整个记录实际上是更新的,而不是其中的单个字段。事实上你是对的,行无论如何都在更新,更新一列应该没什么大不了的。但是,当syntaxI再次阅读您关于在需要更新字段时更新整个记录/行的注释时,请大声想一想,为什么在使用CASE时默认情况下不允许保留此功能。真正地这对我来说是新的