【问题标题】:Update sql query using CASE statement使用 CASE 语句更新 sql 查询
【发布时间】:2020-12-08 04:36:03
【问题描述】:

在下面的查询中,当@test 为0 时,它会将值更新为null。 @test 为 0 时,有什么方法可以保留旧值? (如果@test 为0,则不应该有任何更新)

declare @test bigint

set @test=12

update teacher set dta=(case when @test!=0 then @test end) from teacher

【问题讨论】:

  • 为什么你需要使用CASE 表达式,而你可以在运行更新之前检查一次条件

标签: sql-server sql-update case


【解决方案1】:

是的!您可以将其设置为自身,例如

UPDATE teacher
SET dta = (CASE 
  WHEN @test != 0 THEN @test 
  ELSE dta 
END)

【讨论】:

  • 但在这种情况下也会有我想避免的更新。
  • 是的,您最好只测试IF (@test != 0) 而根本不进行更新。只需使用您提供的格式即可。 :)
  • 是的,这是一种方法,但我在想是否可以使用这种情况。
  • CASE 是一个表达式,所以它只能以导致它成为一个值的方式使用。您可以使用它来选择在更新中使用什么值,或者选择在比较中使用什么值,例如 if 或 where 子句,但如果您的意思是可以使用类似 (CASE WHEN THEN UPDATE ),恐怕不会。
  • IF (1 = (CASE WHEN @test != 0 THEN 1 ELSE 0 END)) 是一种人为的方式,涉及 CASE 并且在不需要时不执行更新。
【解决方案2】:

看起来是有条件更新的好机会:

Declare @test bigint = 12

IF @test <> 0 UPDATE teacher set dta = @test from teacher

请注意,这将更改教师表的 dta 列中的所有值。

【讨论】:

    【解决方案3】:

    你可以试试WHERE子句

    DECLARE @test BIGINT
    
    SET @test=12
    
    UPDATE TEACHER SET DTA=@test FROM teacher 
    WHERE @test!=0
    

    【讨论】: