5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【DB2】SQLで文字列連結をしたら何も表示されなくなった!?って時の備忘録

Last updated at Posted at 2018-11-24

##はじめに
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にならずに値を取り出せます。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?