データベースでデータの追加・変更を行う際にNULLは他とは違う特殊な動作となります。
空文字 = NULLと思っていると意外な場所で嵌ってしまうこともあるので注意が必要です。
そこで今回は「SQLでUPDATEを行う際のNULLの扱い」について解説をしてみたいと思います。
NULLと空文字は別モノ
まずはNULLについて簡単に説明します。
NULLは「ヌル」もしくは「ナル」と読みます。
SQLにおいてのNULLは、レコードに何も入っていない状態を指します。
初心者の方は空文字をNULLと思っている方も多く見られますが、空文字とは違うため混同しないようにしてください。
例えば次のようなデータベーステーブルがあったとします。
id stuff_id sex checkup_date ----------- ----------- ---------- ---------------- 1 1 male NULL 2 2 male 2020-05-24 3 3 female NULL 4 4 female 2020-06-11 5 5 male 2020-04-16
このテーブルでは、”checkup_date”には「NULL値」が入っています。
このテーブルで試しに「空文字」を検索してみましょう。クエリは分かりやすいように「SELECT checkup_date FROM sample_table_B WHERE checkup_date = ”」とします。
すると次のような結果となりました。
SELECT checkup_date FROM sample_table_B WHERE checkup_date = ''; GO checkup_date ---------------- (0 行処理されました)
実行してもnullはHITしません。
この理由として、空文字はデータベース上では「空文字という文字列が存在する」というカタチで扱われます。
よって、NULL値という「何も存在しない」値とは別のモノとして扱われているわけです。
これでNULL値と空文字の違いについてはお分かりいただけたと思います。
UPDATEでnullを扱う
ここまでの説明でnullに関する予備知識は一通りご理解いただけたと思いますので、ここからはnullをUPDATEでどのように扱うかについて解説してみたいと思います。
UPDATEでデータの更新を行う際には、何かの情報をnullに書き換える場合、そしてもう一つは、null値の存在するレコードに対し、null値から別の値に更新しようとする方法の二通りあります。
レコードに登録されている特定のカラムの値を書き換える
「NULLと空文字は別モノ」で触れているように、NULL値は通常の検索では検索結果として反映されません。
例えば先ほどのテーブルがあるとします。
このテーブルのcheckup_dateの値がNULL値以外のもの全てをNULL値に変更してみましょう。
記述方法はまず何も考えずWHEREで条件指定してみます。
UPDATE sample_table_B SET checkup_date = NULL WHERE checkup_date != NULL ; GO (0 行処理されました) SELECT * FROM sample_table_B; GO id stuff_id sex checkup_date ----------- ----------- ---------- ---------------- 1 1 male NULL 2 2 male 2020-05-24 3 3 female NULL 4 4 female 2020-06-11 5 5 male 2020-04-16
WHEREで条件指定したにもかかわらず、書き換わっていないことが確認できます。
では次のコードを見てみましょう。
UPDATE sample_table_B SET checkup_date = NULL WHERE checkup_date IS NOT NULL ; GO (3 行処理されました) SELECT * FROM sample_table_B; GO id stuff_id sex checkup_date ----------- ----------- ---------- ---------------- 1 1 male NULL 2 2 male NULL 3 3 female NULL 4 4 female NULL 5 5 male NULL
こちらの記述では、きちんとNULL値でないレコードだけを抽出しNULL値に変更されていることが確認できます。
このようにUPDATEでNULL値を扱う場合には、条件指定で「IS NULL」もしくは「IS NOT NULL」として指定する必要があります。
複数条件の中にNULLに関する条件がある場合
次に、複数条件の中にNULLに関する条件がある場合を想定してみましょう。
複数条件を一つのクエリで実行するためには通常「IN句」を使用しますので、サンプルコードでも同じようにIN句を使用します。
また今回のサンプルテーブルは以下の通りとなっています。
id stuff_id sex checkup_date ----------- ----------- ---------- ---------------- 1 1 male NULL 2 2 male 2019-05-24 3 3 female NULL 4 4 female 2020-06-11 5 5 male 2020-04-16
サンプルコードは次の通りです。
UPDATE sample_table_B SET checkup_date = '1900-01-01' WHERE checkup_date IN ('2019-05-24', NULL) ; GO (1 行処理されました) SELECT * FROM sample_table_B; GO id stuff_id sex checkup_date ----------- ----------- ---------- ---------------- 1 1 male NULL 2 2 male 1900-01-01 3 3 female NULL 4 4 female 2020-06-11 5 5 male 2020-04-16
IN句を使った複数条件でNULL値を指定しても、先ほどの説明と同じように反映されていないことが確認できます。
それでは次のコードではどうでしょうか。
UPDATE sample_table_B SET checkup_date = '1900-01-01' WHERE checkup_date IN ('2019-05-24') OR checkup_date IS NULL ; GO (3 行処理されました) SELECT * FROM sample_table_B; GO id stuff_id sex checkup_date ----------- ----------- ---------- ---------------- 1 1 male 1900-01-01 2 2 male 1900-01-01 3 3 female 1900-01-01 4 4 female 2020-06-11 5 5 male 2020-04-16
今度は指定された全ての条件で書き換わっていることが確認できます。
このように、NULL値を条件として指定する場合には、他の条件とは別で分ける必要があります。
まとめ
今回は「SQLでUPDATEを行う際のNULLの扱い」について解説してみましたが、いかがでしたか?
NULL値はデータベースの概念上「そこに何も存在しない」値として区別されるため、その他の値とは異なった挙動をします。
もし今後何かでNULLを扱う際には、この記事を思い出してもらえると非常に嬉しく思います。