
データベースを扱う中で、特定の条件に基づいてデータを一括更新する必要が生じることはよくあります。
本記事では、PostgreSQLを使用して複雑な条件を満たすデータの更新方法について解説します。
特に、CASE 文を用いた柔軟なデータ更新の方法を実装例とともに紹介します。
シナリオ
以下の要件を満たすSQLクエリを作成します。
- テーブル名は
example_tableとします。 - 指定された条件に基づいて、
user_idとcompany_idをそれぞれ11と22に更新します。 - 別のカラム
customer_idを以下の条件に基づいて変更します。customer_idが1の場合は6に変更。customer_idが2の場合は7に変更。customer_idが3の場合は8に変更。customer_idが4の場合は5に変更。
- ただし、
user_idが5,10,15のレコードは対象外とします。
実装例
以下に要件を満たすSQLクエリを示します。
UPDATE example_table
SET
user_id = 11,
company_id = 22,
customer_id = CASE
WHEN customer_id = 1 THEN 6
WHEN customer_id = 2 THEN 7
WHEN customer_id = 3 THEN 8
WHEN customer_id = 4 THEN 5
ELSE customer_id
END
WHERE user_id NOT IN (5, 10, 15);
クエリの解説
- 更新対象の列を指定する
SET文でuser_idとcompany_idをそれぞれ固定値に変更しています。
- 条件による値の変更
CASE文を使用し、customer_idを条件ごとに異なる値に更新します。ELSE customer_idは、CASE文の条件に一致しない場合に元の値を保持するためのものです。これがないと、条件に当てはまらない場合にNULLが設定される可能性があります。
- 対象外条件を設定する
WHERE文で、user_idが5,10,15のレコードを更新対象から除外しています。
注意点
- バックアップの取得
- データ更新クエリを実行する前に、必ずバックアップを取得してください。
誤ったクエリを実行するとデータが失われる可能性があります。
- データ更新クエリを実行する前に、必ずバックアップを取得してください。
- トランザクションの利用
- 更新が失敗した場合にロールバックできるよう、トランザクションを使用することを推奨します。
BEGIN;
UPDATE example_table
SET
user_id = 11,
company_id = 22,
customer_id = CASE
WHEN customer_id = 1 THEN 6
WHEN customer_id = 2 THEN 7
WHEN customer_id = 3 THEN 8
WHEN customer_id = 4 THEN 5
ELSE customer_id
END
WHERE user_id NOT IN (5, 10, 15);
-- 更新内容を確認
SELECT * FROM example_table WHERE user_id = 11;
-- 問題がなければコミット
COMMIT;
-- 問題があればロールバック
-- ROLLBACK;
まとめ
PostgreSQLのUPDATE文は、柔軟性が高く、条件付きでデータを一括更新する際に非常に便利です。
特に、CASE 文を活用することで複雑な条件を簡潔に記述できます。
システム開発やデータメンテナンスの際には、この手法を活用して効率的に作業を進めましょう。
問題解決や効率化に役立つ他のテクニックについても随時紹介していきますので、ぜひ参考にしてください!
- Original:https://minory.org/sql-update-case.html
- Source:minory
- Author:管理者
Amazonベストセラー
Now loading...