4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

いくつかの条件ごとに更新する行や内容を切り替える

Posted at

同一テーブル内の複数の行を更新する際、行ごとに更新する内容を切り替えたい場合はUPDATECASEの合わせ技を用います。

たとえばユーザの個人情報を格納したテーブルがあるとします。このとき「AさんとBさんのパスワードと生年月日を更新したい、そしてそれ以外のユーザの個人情報はそのままにしておきたい」というときは次のようなSQLにより実現することができます。

UPDATE table
SET
    password = CASE name
        WHEN 'Aさん' THEN 'password_a'
        WHEN 'Bさん' THEN 'password_b'
        ELSE password
    END,
    
    birthday = CASE name
        WHEN 'Aさん' THEN 'birthday_a'
        WHEN 'Bさん' THEN 'birthday_b'
        ELSE birthday
    END

注意すべきはELSEです。UPDATEはテーブル全体、あるいはWHEREによって限定された範囲全体に対して更新処理を行おうとします。上述の例の場合は「AさんとBさん以外は更新しない」、つまり「AさんとBさん以外は現在のパスワードと生年月日のままにする」ということを明示的に宣言してやらねばなりません。

上記のようなSQLがわかりづらいのは「条件節が戻り値を持つ」という点でしょうか。Lispなどの関数型言語に慣れていると、特に違和感なく受け入れられると思いますが……。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?