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

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

  • CONCAT('A', 'B') → 'AB'
  • CONCAT('A', null) → null
てっきり、空の文字列として処理されるんだと思ってました。
…ってマニュアルにきちんと書かれてるね。

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

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


でどうしたらいいかって言うと、IFNULLを使って明示的にnull以外の要素(例えば"")を返すと。
CONCAT(IFNULL(fieldA, ''), IFNULL(fieldB, ''))
この場合、各フィールドがnullの時には空の文字列として扱うので、結合してもnullにならない。
fieldAが文字列A、fieldBがnullだった場合、結合結果は文字列Aになる。なるほど。


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