■数値型の列に対し、現在の値を判定対象として別の値へ変えたいというケース
【事例】
以下の条件でテーブルに更新をかける
1.現在の給料が30万円以上の社員は10%減給とする
2.現在の給料が25万円以上28万円以下の社員は、20%の昇給とする
【誤ったSQL】
以下のように単純にUPDATE文を2回実行した場合は出力結果が正しくならない。
※1回目の条件1で30万円いじょうの相田さんを10パーセント減給したが
2回目の条件2で減給した相田さんに対して20パーセント昇給してしまい、
誤った結果となった
--条件1 UPDATE salaries SET salary = salary * 0.9 WHERE salary >= 300000; --条件2 UPDATE salaries SET salary = salary * 1.2 WHERE salary >= 250000 AND salary < 280000;
【正しいSQL】
※最終行のELSE salary は必ず書く。
記載しない場合は条件1,2のどちらにも当てはまらない社員の給料がNULLになる。
「CASE式に明示的なELSE句がない場合、デフォルトでELSE NULLとみなす」
というCASE式の仕様による。
--正しい更新はCASE式で書く UPDATE salaries SET salary = CASE WHEN salary >= 300000 THEN salary * 0.9 WHEN salary >= 250000 AND salary < 280000 THEN salary * 1.2 ELSE salary END;
【参考】
サンプルテーブル作成用SQL
CREATE TABLE salaries (name VARCHAR(32) PRIMARY KEY, salary INTEGER NOT NULL); INSERT INTO salaries VALUES('相田', 300000); INSERT INTO salaries VALUES('神崎', 270000); INSERT INTO salaries VALUES('木村', 220000); INSERT INTO salaries VALUES('斉藤', 290000);