Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【SQL】UPDATE時、非NULL属性のみ更新する

テーブルのレコードを更新する時に値が非NULLの属性だけを更新したいケースが発生し、
少し考えた結果、以下のようなやり方に落ち着きました。

DBMSDb2です。

-- テーブル定義
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に成功。
とりあえずは一安心。