web-dev-qa-db-ja.com

T-SQL:UPDATEステートメントでCASEを使用して、条件に応じて特定の列を更新する

これがまったく可能かどうか疑問に思っています。条件が真の場合、列xを更新します。そうでない場合、列yが更新されます。

UPDATE table SET
     (CASE (CONDITION) WHEN TRUE THEN columnx
                       ELSE columny
      END)
= 25

私はあちこち検索して、いくつかのことを試しましたが、解決策を見つけることができません。それは不可能だと思いますが、私はここで尋ねて、誰かが以前にそれをやったことがあるかどうかを見ると思いました。前もって感謝します。

88
pqsk

条件を使用してクエリの構造を変更することはできません。関連するデータだけを変更してください。これを行うことができます:

update table set
    columnx = (case when condition then 25 else columnx end),
    columny = (case when condition then columny else 25 end)

これは意味的には同じですが、両方の列が常に更新されるであることに留意してください。これおそらくは問題を引き起こしませんが、トランザクション量が多い場合、同時実行の問題が発生する可能性があります。

具体的にを行う唯一の方法は、動的SQLを使用することです。ただし、これは避けることをお勧めします。上記のソリューションは、ほぼ確実にあなたが求めているものに十分です。

163
Adam Robinson
UPDATE  table
SET     columnx = CASE WHEN condition THEN 25 ELSE columnx END,
        columny = CASE WHEN condition THEN columny ELSE 25 END
22
Quassnoi

enter image description here

Caseステートメントを使用して8018070777があるContactNoを8018070999に変更または更新したい

update [Contacts] set contactNo=(case 
when contactNo=8018070777 then 8018070999
else
contactNo
end)

enter image description here

1
Debendra Dash

これは非常に古い質問であり、問​​題は修正済みとしてマークされています。ただし、テーブルに更新イベントのデータロギングのトリガーがある私のようなケースがある場合、これは問題を引き起こします。両方の列が更新を取得し、ログが無駄なエントリを作成します。私がした方法

IF (CONDITION) IS TRUE
BEGIN
    UPDATE table SET columnx = 25
END
ELSE
BEGIN
    UPDATE table SET columny = 25
END

これには、上記のソリューションのように、テーブルに不必要な書き込みがないという別の利点があります。

1
Harsh

これは非常に古い質問ですが、これは私にとってはうまくいきました:

UPDATE TABLE SET FIELD1 =
CASE 
WHEN FIELD1 = Condition1 THEN 'Result1'
WHEN FIELD1 = Condition2 THEN 'Result2'
WHEN FIELD1 = Condition3 THEN 'Result3'
END;

よろしく