Hatena::ブログ(Diary)

130単位

2008-12-12

PostgreSQL COALESCEでNULLを空白に変換

PostgreSQL NULL同士をイコールとして比較したい場合 - 130単位

この記事の続きです。

記事の最後で空白とNULLの比較について少し触れました。が、その方法はまだ調べてすらいなかったため、次回のネタにしようと考えていました。

そしたら、試すよりも前にトラックバック先で教えていただきました。ありがとうございます。

COALESCE関数

coalesce()を使ってNULLを空白に変換してから比較してみてはどうでしょうか。比較対象が文字列型であれば、

coalesce(a.pref, '') = coalesce(b.pref, '')

のようになると思います。

IS NOT DISTINCT FROM - iakioの日記 - postgresqlグループ

COALESCE関数は、引数の中でNULLでない最初の値を返すものみたいです。これを用いることによって、イコール演算子で比較することが可能になります。前回の例でいくと、以下のようになります。

CASE WHEN COALESCE(a.pref, '') = COALESCE(b.pref, '')
      AND COALESCE(a.city, '') = COALESCE(b.city, '')
      AND COALESCE(a.town, '') = COALESCE(b.town, '')
      AND COALESCE(a.tel, '')  = COALESCE(b.tel, '')
     THEN '1'
     ELSE '0'
END AS same_address_flg

実際試してみて、正しく判別できていることがわかりました。

連結してから比較?

ところで、最初に自分が思いついた方法は、「||」を使って文字列を連結してから比較するというものでした。SQL例は以下。

CASE WHEN (a.pref || a.city || a.town || a.tel) = (b.pref || b.city || b.town || b.tel)
     THEN '1'
     ELSE '0'
END AS same_address_flg

しかし、実際にやってみたところうまくいきません。NULLを含むイコールの比較と同様に、NULLが含まれていると連結した結果もNULLになってしまうみたいです。

そんなわけで、なんにしてもCOALESCE関数を用いるのが良いようです。

参考リンク

SQL の COALESCE 
http://sonic64.com/2003-07-29.html

co・a・lesce - goo 辞書
http://dictionary.goo.ne.jp/search.php?MT=coalesce&kind=ej

goo辞書で発音が聞けますが、「こーあれす」と読むようです。「れ」にアクセント。


4798123358
PostgreSQL徹底入門 第3版

ozakiozaki 2012/04/20 10:37 IS NULLとかIS NOT NULLとか面倒だなぁ、と思っていたので、とても参考になりました!ありがとうございます!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/deeeki/20081212/coalesce
リンク元