##はじめに
SQLの文字列結合は便利ですが、値うまくを取り出せない場合もあります。
今回は以下のテーブル(personal_information)から、それぞれのレコードをCSVファイルのような形で出力する場合を例にして、値が取れないケースを紹介します。
※そもそも文字列結合って何って方はこちらの記事をご覧ください
USERID | LASTNAME | LASTNAME_KANA | ADDRESS | AGE |
---|---|---|---|---|
11111 | 鈴木 | スズキ | 静岡 | 22 |
22222 | 加藤 | カトウ | 愛知 | |
33333 | 佐藤 | 山形 | 36 | |
44444 | 田中 | タナカ | 26 |
##テーブルからそれぞれのレコードをCSVファイルのような形で出力
実行するSQL
SELECT
USERID ||,|| LASTNAME ||,|| LASTNAME_KANA ||,|| ADDRESS ||,|| AGE AS information
FROM
personal_information
期待する検索結果
information
------------
11111,鈴木,スズキ,静岡,22
22222,加藤,カトウ,愛知,
33333,佐藤,,山形,36
44444,田中,タナカ,,26
上記のテーブルは、1行目のレコード以外、データに一部抜けがありますが、その部分を空白にして値を取り出すことを想定しています。
ところが・・・
実際の検索結果(1行目のレコードしか表示されない)
information
------------
11111,鈴木,スズキ,静岡,22
このままSQLを実行しても、1行目のレコードしか表示されません。
##原因
今回使用したテーブルに問題がありました。
USERID | LASTNAME | LASTNAME_KANA | ADDRESS | AGE |
---|---|---|---|---|
11111 | 鈴木 | スズキ | 静岡 | 22 |
22222 | 加藤 | カトウ | 愛知 | NULL |
33333 | 佐藤 | NULL | 山形 | 36 |
44444 | 田中 | タナカ | NULL | 26 |
結合対象のカラムにNULLが存在すると、結合した文字列ごとNULL扱いとなってしまいます。
そのため今回は1行目のレコードしか表示されませんでした。
イメージ
information
------------
11111,鈴木,スズキ,静岡,22
//2行目は「AGE」がNULLだから表示されない
//3行目は「LASTNAME_KANA」がNULLだから表示されない
//4行目は「ADDRESS」がNULLだから表示されない
##解決策
NULLを空文字に変換しましょう。
DB2の場合はCOALESCE関数を使用すれば空文字に変換できます。
NULLを空文字に変換
SELECT
USERID
||,||
LASTNAME
||,||
COALESCE(LASTNAME_KANA, '')
||,||
COALESCE(ADDRESS, '')
||,||
COALESCE(AGE, '')
AS information
FROM
personal_information
これで連結した文字列がNULLにならずに値を取り出せます。