【SQL】UPDATE時、非NULL属性のみ更新する
テーブルのレコードを更新する時に値が非NULLの属性だけを更新したいケースが発生し、
少し考えた結果、以下のようなやり方に落ち着きました。
-- テーブル定義 CREATE TABLE HOGE { ID INTEGER NOT NULL, NAME VARCHAR(16), ADDRESS VARCHAR(64), DESCRIPTION VARCHAR(256), PRIMARY KEY (ID) } ORGANIZED BY ROW; -- 更新処理 -- :newName, :newAge, :newDescription, :id は更新値のプレースホルダ UPDATE TABLE SET NAME = (CASE WHEN :newName IS NOT NULL THEN :newName ELSE NAME END), AGE = (CASE WHEN :newAge IS NOT NULL THEN :newAge ELSE AGE END), DESCRIPTION = (CASE WHEN :newDescription IS NOT NULL THEN :newDescription ELSE DESCRIPTION END) WHERE ID = :id;
更新対象のカラムに、CASE式の返り値を格納します。
上記SQLのCASE式内では、格納する値がNULLであるかどうかをチェックし、NULLであればカラム値を変更しないという処理を行っています。
SQLではCASEが式であるというのが重要で、CASEの返戻値が他の構文で評価できるので非常に便利です。
実際のケース
開発していたWebサービスのサーバがORマッパを使ってRDBを操作していたのですが、ORマッパで使うコンテナオブジェクトのプロパティがデフォルトでnullになっており、一部のプロパティ値だけクライアントから送信すると他のプロパティ値がNULLになってしまっていました。
上記のようなSQLで対応し、差分UPDATEに成功。
とりあえずは一安心。