[MySQL] nullと結合するとnullになる

MySQL
2つのフィールドをCONCAT()で結合して検索するクエリを書いていたのだけど、どうも検索に失敗するパターンがあるらしく、なんだなんだと思ってたらそう言うことでした。



[MySQL]nullを含むフィールドのconcat | HappyQuality


  • CONCAT(‘A’, ‘B’) → ‘AB’
  • CONCAT(‘A’, null) → null


てっきり、空の文字列として処理されるんだと思ってました。
…ってマニュアルにきちんと書かれてるね。


引数のいずれかかが NULL である場合、CONCAT() は NULL を返します。

MySQL :: MySQL 8.0 リファレンスマニュアル :: 12.8 文字列関数および演算子


そうかー。
読んだはずだけど甘かった。


でどうしたらいいかって言うと、IFNULLを使って明示的にnull以外の要素(例えば””)を返すと。


CONCAT(IFNULL(fieldA, ''), IFNULL(fieldB, ''))


この場合、各フィールドがnullの時には空の文字列として扱うので、結合してもnullにならない。
fieldAが文字列A、fieldBがnullだった場合、結合結果は文字列Aになる。なるほど。


しかし、MySQLの関数って意外に色々あって面白いね。
クエリの速度下げたら意味無いけど、処理トータルで考えると使える場面も多々ありそう。
まぁSQLを手で書くの?という話ではあるかも知れないけども。