はじめに
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の分岐はコツがいる