MySQL CASE文でNULLの分岐はコツがいる

はじめに

CASE文でNULLの分岐は単純にはできません。
ほんとだよ!

例としてusersというテーブルがあって、
その中に名前(name)と体重(weight)のフィールドがあるとします。

id name weight
1 Aさん 50
2 Bさん 60
3 Cさん 70
4 Dさん 80
5 Eさん NULL

 

やりたいこと

こんなことする機会があるかどうかはおいといて!
体重を測っている人の名前の後ろに(計測済)、測っていない人の名前の後ろに(未計測)とつけたい
つまりこうしたい。

id name weight
1 Aさん(計測済) 50
2 Bさん(計測済) 60
3 Cさん(計測済) 70
4 Dさん(計測済) 80
5 Eさん(未計測) NULL

やりがちなこと

何も知らずにSQLを書いたらこうなると思います。(俺はこう書いた)

UPDATE users
SET name = 
   CONCAT(name,
          CASE weight WHEN NULL THEN "(未計測)" ELSE "(計測済)" END
         );

しかしこれだと結果が

id name weight
1 Aさん(計測済) 50
2 Bさん(計測済) 60
3 Cさん(計測済) 70
4 Dさん(計測済) 80
5 Eさん(計測済)) NULL

となってしまいます。

CASE xxx WHEN NULLでNULLの分岐はできないんですねえ…

解決方法

こうするとNULLで分岐ができます。

UPDATE users
SET name = 
   CONCAT(name,
          CASE weight IS NULL WHEN 1 THEN "(未計測)" ELSE "(計測済)" END
         );

これはほんの一例なので他にも方法はあります。

終わりに

ということでCASE文でNULLの分岐はコツがいるという話でした。

 

Qiitaで見たいかはたこちら