MySQL の文字列連結で一つでも NULL なカラムがあると連結結果も NULL になる問題
2018/09/09 12:28
  • 先日 MySQL の文字列結合(CONCAT)で少しハマったのでメモ。

    concat で文字列を結合する

    データは適当ですが、だいたいこんな感じのデータを用意しました。

    mysql> select * from addresses;
    +----+-----------------+-----------+---------------------+
    | id | prefecture_name | city_name | other               |
    +----+-----------------+-----------+---------------------+
    |  1 | 東京都          | 港区      | NULL                |
    |  2 | 東京都          | NULL      | ほげほげ1丁目       |
    |  3 | NULL            | 札幌市    | ほげほげ2丁目       |
    |  4 | 沖縄県          | 那覇市    | ほげほげ3丁目       |
    +----+-----------------+-----------+---------------------+
    4 rows in set (0.00 sec)
    


    このデータで住所を連結して表示するため安直に concat を使います

    mysql> select id, concat(prefecture_name, city_name, other) as address from addresses;
    +----+---------------------------------------+
    | id | address                               |
    +----+---------------------------------------+
    |  1 | NULL                                  |
    |  2 | NULL                                  |
    |  3 | NULL                                  |
    |  4 | 沖縄県那覇市ほげほげ3丁目             |
    +----+---------------------------------------+
    4 rows in set (0.00 sec)
    


    NULL なカラムがあると、連結結果も NULL となってしまいます。concat ってそもそも文字列結合なので NULL 文字列を想定していないのも頷けます。VARCHAR, TEXT などの文字列型のカラムに対して Nullable に設定するのは良くないのかもしれません。


    NULL なカラムがあると文字列結合結果が NULL になる問題を解決するために、IFNULL で NULL チェックをして、 NULL の場合は "" 空文字列で置換する処理を入れます。

    mysql> select id, concat(ifnull(prefecture_name,""), ifnull(city_name,""), ifnull(other,"")) as address from addresses;
    +----+---------------------------------------+
    | id | address                               |
    +----+---------------------------------------+
    |  1 | 東京都港区                            |
    |  2 | 東京都ほげほげ1丁目                   |
    |  3 | 札幌市ほげほげ2丁目                   |
    |  4 | 沖縄県那覇市ほげほげ3丁目             |
    +----+---------------------------------------+
    4 rows in set (0.00 sec)
    


    NULL"" に置換されたため、意図した結合結果になりました。


    人気ブログランキングへ ブログランキング・にほんブログ村へ
    ↑応援よろしくお願いします!m(_ _)m

  • <2018/09/09 12:28>
  • SQL
  • MySQLCONCATIFNULLNULL空文字列文字列結合連結
  • 新しい記事へ
    WordCamp Tokyo 2018 で登壇しました

    古い記事へ
    【ふわラボ】Go 言語で作る便利ツール群の紹介と制作の経緯など

profile picture

自己紹介的な何か

@wkmettyでついったーやってます。時々。 6年間勤めたゲーム会社を2018年2月に退職しフリーランスのプログラマに。 WordPress Core, WP-CLI コントリビューター。 お仕事募集中です。