はじめに
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の分岐はコツがいるという話でした。
ブログで見たい方はこちら
MySQL CASE文でNULLの分岐はコツがいる