やりたいこと
SELECT文でデータを取得した際に、そのデータが空文字、もしくはNULLだった場合に代わりの文字列を出したい。
NULLのデータの変換は簡単
NULLの場合はifnull関数を使えば簡単に変換できる。
-- nameがNULLだった場合に'名無しさん'に変換
select ifnull(name, '名無しさん') from users;
このようにifnull関数を使うと、取得したデータがNULLだった場合に第2引数に変換される。
【参考記事】
しかし、今回は空文字とNULLを両方変換したいので、ifnullを使って実現するのは難しい。
case式を使って条件分岐
case式で空文字とNULLの場合に別の文字列に変換する。
-- nameがNULL、もしくは空文字だった場合は'名無しさん'に変換
-- それ以外の場合はそのままnameを取得
select
case
when name is null or name = '' then '名無しさん'
else name
end as name
from users;
1行で書く
select case when name is null or name = '' then '名無しさん' else name end as name from users;
これで本題の目的どおりに取得できる。
【参考記事】
case式を使う場合、次の点に気を付ける。(というか僕がひっかかった点)
- name = nullでは変換できないため、name is nullとする。
- endのあとにasでカラム名を設定する。(設定しないと「case when name is null or name = '' then '名無しさん' else name end」がカラム名になる)
まとめ
case式はすごく便利。