sql server更新查询中的if条件

Posted

技术标签:

【中文标题】sql server更新查询中的if条件【英文标题】:if condition in sql server update query 【发布时间】:2013-09-08 10:06:20 【问题描述】:

我有一个 SQL 服务器表,其中有 2 列我想根据发送到存储过程的标志以及新值来更新它们的任何一个值,例如:

UPDATE
    table_Name

SET
    CASE
        WHEN @flag = '1' THEN column_A += @new_value
        WHEN @flag = '0' THEN column_B += @new_value
    END AS Total

WHERE
    ID = @ID

执行此操作的正确 SQL 服务器代码是什么??

【问题讨论】:

为什么是+=?您正在尝试将 @new_value 附加到列中的内容? 是的,这就是我需要条件更新代码的原因,因为根据标志我将更新预期的列 【参考方案1】:

这样的事情应该可以工作:

UPDATE
    table_Name
SET 
  column_A = CASE WHEN @flag = '1' THEN column_A + @new_value ELSE column_A END,
  column_B = CASE WHEN @flag = '0' THEN column_B + @new_value ELSE column_B END
WHERE
    ID = @ID

【讨论】:

【参考方案2】:

当前的答案很好,应该可以正常工作,但是更简单、更明显、更易于维护的有什么问题:

IF @flag = 1
    UPDATE table_name SET column_A = column_A + @new_value WHERE ID = @ID;
ELSE
    UPDATE table_name SET column_B = column_B + @new_value WHERE ID = @ID;

尽管这是一个非常简单的查询,但它更容易阅读。

这是一个由@snyder 提供的工作示例:SqlFiddle。

【讨论】:

@snyder。谢谢,只是分号。 SqlFiddle. @flem - 您不需要删除分号,只需更改右侧面板中的语句终止符。 sqlfiddle.com/#!3/2ea6e/2 其实我不太喜欢这个答案,你必须写两次 where 子句和表名,如果整个查询比这个简单的例子更复杂,这可能很难维护 @RomanPekar。这是一个公平的观点,也是我写“尽管这是一个非常简单的查询”的原因。此答案的目的是为其他答案提供替代方案。与第三代编程语言不同,DRY 不一定是 SQL 编程的最佳实践。性能是这里的关键。 OP 应该考虑这两个选项,并根据 实际 查询做出明智的选择。 如果更新次数很少,并且查询对于 A 列和 B 列的更新是相同的,那么其他答案都很好,但是如果我在演示我的代码,我不会觉得很好。我怀疑我们在这里主要考虑的是“编程逻辑”而不是“设置逻辑”。我想知道真正的 DBD 会说什么……【参考方案3】:

由于您使用的是 SQL 2008:

UPDATE
    table_Name

SET
    column_A  
     = CASE
        WHEN @flag = '1' THEN @new_value
        ELSE 0
    END + column_A,

    column_B  
     = CASE
        WHEN @flag = '0' THEN @new_value
        ELSE 0
    END + column_B 
WHERE
    ID = @ID

如果您使用的是 SQL 2012:

UPDATE
    table_Name
SET
    column_A  = column_A + IIF(@flag = '1', @new_value, 0),
    column_B  = column_B + IIF(@flag = '0', @new_value, 0)
WHERE
    ID = @ID

【讨论】:

【参考方案4】:

效果很好:

UPDATE
    table_Name
SET 
  column_A = CASE WHEN @flag = '1' THEN column_A + @new_value ELSE column_A END,
  column_B = CASE WHEN @flag = '0' THEN column_B + @new_value ELSE column_B END
WHERE
    ID = @ID

【讨论】:

【参考方案5】:
DECLARE @JCnt int=null
SEt @JCnt=(SELECT COUNT( ISNUll(EmpCode,0)) FROM tbl_Employees WHERE EmpCode=1  )

UPDATE #TempCode
SET janCA= CASE WHEN @JCnt>0 THEN (SELECT SUM (ISNUll(Amount,0)) FROM tbl_Salary WHERE Code=1 )ELSE 0 END
WHERE code=1

【讨论】:

以上是关于sql server更新查询中的if条件的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 条件语句的查询执行计划

如果 SQL Server 中的条件选择值 [重复]

三:动态SQL

C# 查询 SQL Server 表中的 JSON 列以获取匹配的行

sql server怎么把多个查询结果关联起来

ms sql server中where子句中的if else条件