『空文字(空白、ブランク)を置換したい』
データベースを扱う際、あるカラムに値が入っていなかった場合に処理を行うというケースがある。
しかしMySQLの場合はこの何も入ってない場合の処理が少しややこしいので紹介したいと思う。
『何も入ってない』は2種類ある
『何も入ってない』は『何も入ってない』だろ、と思うかも知れないが、データベースの世界には以下の2種類の表現がある。
- 空文字(ブランク)
- NULL(ヌル)
空文字(ブランク)
空文字(ブランク)は ""
という状態。
イメージとしては 何か入れる為に入れ物を用意したけど何も入ってない のイメージだろうか。
NULL(ヌル)
NULLはデータベース上でも NULL
と表現される。
イメージは 入れ物を用意する前 という感じ。
空文字とNULLは同じではない
以下のSQLが示すように、空文字とNULLは同じではない。
SQL
select (CASE WHEN ""=NULL THEN 1 ELSE 0 END) as null_is_blank from dual;
結果
null_is_blank 0
しかし同じではないのに !=''
の場合は空文字とNULLが同じであるかのような挙動をする。
SELECT * FROM tbl_name WHERE str != '';
→空文字とNULL値が除外される
MySQLのNULL値と空文字の扱いについて - まいけるの日記
故に『何も入ってない場合』を処理する為には、どちらかをもう一方に置換する必要がある。
空文字(空白、ブランク)を置換する
ついに本題である空文字の置換であるが、ここでも少し問題がある。
Oracleであれば DECODE関数
に置換したい値と置換後の値を引数に設定すれば置換できるのだが、MySQLにDECODE関数は無い。
そこで空文字カラムを何か別の値に置換するには2段階の処理を行う。
- nullifで空文字カラムをNULLに置換
- そしてifnullで目的の値に置換する
ifnull(nullif(置換したいカラム,''),'置換したい値')
まとめ
- 『何も入ってない』は空文字とNULLの2種類あってそれぞれ意味が違う
- MySQLにOracleのDECODE関数は無い
- 空文字を置換したい場合は一度NULLに置換した後にさらに別の値に置換する方法をとる