同一テーブル内の複数の行を更新する際、行ごとに更新する内容を切り替えたい場合はUPDATE
とCASE
の合わせ技を用います。
たとえばユーザの個人情報を格納したテーブルがあるとします。このとき「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などの関数型言語に慣れていると、特に違和感なく受け入れられると思いますが……。