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


108

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

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

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


すべてが同じ表にあると仮定すると、はい。あなたはいつでもそれをトランザクションで実行し、エラー時にロールバックして、自分で確かめることができます。
OMGポニー2011年

どういう意味かわかりません。カラムに条件を付けてみましたが、うまくいきません。これは、selectステートメントでは機能しますが、updateステートメントでは機能しません。 tはそれを機能させる方法のようです
pqsk '28年

回答:


188

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

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

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

具体的にあなたが求めていることを行う唯一の方法は、動的SQLを使用することです。ただし、これは避けてください。上記の解決策はほぼ間違いなくあなたが求めているもので十分です。


動的SQLについて同意します。それで私のデータは影響を受けますか?特定の条件で変更したくないということです。だから、すでにそこにあるものを再挿入するだけですか?データベースへのヒットの量はそれほど悪くないかもしれません。
pqsk 2011年

@pqsk:これはデータに影響を与えないはずです。影響を受けるはずのない列に対して、すでに存在するものを再挿入するだけです。
Adam Robinson

ありがとう。私はこれで行きます。とてもシンプルで、穴居人でさえそれを行うことができます。はは。
pqsk '28年

1
1.5年が経過している@AdamRobinsonあなたが1つの列のみを更新するためにいくつかのより効率的な方法を知っていますか

@Somebodyisintrouble:1つの列を更新する唯一の方法は、別のクエリを使用することです。
アダムロビンソン

23
UPDATE  table
SET     columnx = CASE WHEN condition THEN 25 ELSE columnx END,
        columny = CASE WHEN condition THEN columny ELSE 25 END

1
Adamの応答をコピーしただけですか、それとも他の場所から取得したのですか?はは。ただそれに気づきました。
pqsk '28年

1
@pqsk:私たちの応答は1分ほど離れていたので、[送信]をクリックするのが少し速くなったと思います;)
アダムロビンソン

23
@pqsk:はい、23投稿した数秒前に、Adamの応答をコピーしました。私は一人の速いコピーペーストです!
Quassnoi、2011年

2
@pqsk:にカーソルを合わせると* min ago、投稿された正確な時刻が表示されます。
Quassnoi、2011年

2
公平を期すために、両方が同じであるとしても、もしあなたの後にアダムスが出てきたなら、彼はもう少し詳しく述べました。それが私が彼を答えとしてマークした理由です。ありがとう。
pqsk 2011年

4

ここに画像の説明を入力してください

CaseNoを使用して8018070777がある8018070999にContactNoを変更または更新したい

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

ここに画像の説明を入力してください


1
このため、このクエリを使用しない理由UPDATE [Contacts] SET contactNo = 8018070999 WHERE contactNo = 8018070777
NewGuy

4

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

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

よろしく


1

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

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

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


これは良い点であり、良い代替手段です!このスレッドにつながる元のコードはもう機能していませんが、さまざまな解決策があることは常に良いことであり、これは良い解決策だと思います
pqsk

-1

次のように他の回答を調整することで、「望ましくない」列の更新を省略できると思います。
update table set columnx = (case when condition1 then 25 end), columny = (case when condition2 then 25 end)

私が理解しているように、これは条件が満たされた場合にのみ更新されます。

すべてのコメントを読んだ後、これが最も効率的です。
Update table set ColumnX = 25 where Condition1 Update table set ColumnY = 25 where Condition1

サンプルテーブル:
CREATE TABLE [dbo].[tblTest]( [ColX] [int] NULL, [ColY] [int] NULL, [ColConditional] [bit] NULL, [id] [int] IDENTITY(1,1) NOT NULL ) ON [PRIMARY]
サンプルデータ:
Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1) Insert into tblTest (ColX, ColY, ColConditional) values (1, null, null) Insert into tblTest (ColX, ColY, ColConditional) values (2, null, null) Insert into tblTest (ColX, ColY, ColConditional) values (null, 1, null) Insert into tblTest (ColX, ColY, ColConditional) values (null, 2, null)

nullを処理する条件を記述できると思います。私の例では、True、False、またはNullと評価される条件を記述したと想定しています。これについてサポートが必要な場合はお知らせください。最善を尽くします。

これらの2行のコードを実行すると、ColConditionalがTrue(1)の場合に限り、Xは25に変更され、ColConditionalがFalse(0)の場合のみ、Yは25に変更されます。

Update tblTest set ColX = 25 where ColConditional = 1 Update tblTest set ColY = 25 where ColConditional = 0

PSヌルのケースは、元の質問や質問の更新ではまったく言及されていませんでしたが、ご覧のとおり、この非常に単純な答えがとにかく処理します。


1
これは実際には機能しません。1つは、列がnullを許可する場合、条件が満たされない場合はnull値が割り当てられることです。nullが許可されていない場合、更新は失敗します。最後の「効率的な」クエリは、少なくともTSQLでは無効なSQLです。これを特定のエンジンでテストしましたが、うまくいきましたか?
pqsk 2015

これをSQL Server 2005でテストしましたが、図のように完全に機能します。上記のテストではnull値が更新されないため、なぜそれが反対票が投じられたのか、およびNULL値が更新される例を知りたいと思います。私はいつも、最も単純な答えが最善であると考えてきました。何百万ものレコードがあるデータベースを扱っている場合、不要な行を更新したくありません。
John Greiner、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.