Edited at

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の分岐はコツがいるという話でした。

ブログで見たい方はこちら

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