postgreSQL : 文字列連結した問い合わせが空文字になるのはnullが原因


postgreSQLで文字列をパイプ(||)を使って連結したはずのSQLが空文字になって困った経験はありませんか?
そんな時は、連結するカラムのいずれかがNULLを返していないか、を確認した方が良いです。


たとえばCSV出力したい時に

select val1 || ',' || val2 || ',' || val3 from hoge ;

といったSQLを書く場合があると思います。
val1,val2,val3がいずれもNOT NULL指定してあれば問題ないのですが、
もしval1,val2,val3のいずれかの列がnullだと、他の列がnull以外の文字列であっても結果は空文字が返ってくるので注意が必要です。
(同じ現象はMySQLのconcat関数でも発生します。)

null値が入っているかもしれない文字列を連結する時はcoalesce関数を用いて

select coalesce(val1,'') || ',' || coalesce(val2,'') || coalesce(val3,'') from hoge ;

としておいた方が無難です。coalesce関数は複数の引数を持つことができ、左から見て最初の非NULLの値を返しますので上記の例だとval1,val2,val3いずれかがNULLだった場合でも、その部分だけを空文字として連結してくれます。

NULLをどんな文字列で連結しても空文字を返すというのが仕様みたいです。

select 'any' || NULL || 'any' ;       -- >  空文字が返る。
select 'any' || COALESCE(NULL,'') || 'any' ;     -- > 'anyany'が返る。
タグ:
カテゴリー: データベース

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

カテゴリー