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辞書で発音が聞けますが、「こーあれす」と読むようです。「れ」にアクセント。
トラックバック - http://d.hatena.ne.jp/deeeki/20081212/coalesce
リンク元
- 610 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4ADBF_jaJP244JP245&q=130単位
- 437 http://www.google.co.jp/url?sa=t&rct=j&q=coalesce&source=web&cd=9&ved=0CHoQFjAI&url=http://d.hatena.ne.jp/deeeki/20081212/coalesce&ei=ws2fTtKhHc24iAeQwLDqBg&usg=AFQjCNEZplHTAQY0IbGsMncE1-5NYmrFGQ&sig2=c9Q94fimj0CGd933FCYD9Q
- 354 http://www.google.co.jp/search?hl=ja&source=hp&q=postgresql+coalesce&lr=&aq=f&oq=
- 321 http://www.google.co.jp/url?sa=t&rct=j&q=postgresql coalesce&source=web&cd=1&sqi=2&ved=0CBsQFjAA&url=http://d.hatena.ne.jp/deeeki/20081212/coalesce&ei=gweETu3gEMOfiQfE7bidDw&usg=AFQjCNEZplHTAQY0IbGsMncE1-5NYmrFGQ
- 293 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCYQFjAA&url=http://d.hatena.ne.jp/deeeki/20081212/coalesce&ei=ivEpT_eOEsbumAWcnODMAw&usg=AFQjCNEZplHTAQY0IbGsMncE1-5NYmrFGQ
- 281 http://www.google.co.jp/url?sa=t&rct=j&q=postgresql+coalesce&source=web&cd=1&sqi=2&ved=0CCoQFjAA&url=http://d.hatena.ne.jp/deeeki/20081212/coalesce&ctbs=lr:lang_1ja&ei=pAXGTtHECaGdmQX--eAh&usg=AFQjCNEZplHTAQY0IbGsMncE1-5NYmrFGQ
- 278 http://www.google.co.jp/search?q=postgresql+COALESCE&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a
- 277 http://www.google.co.jp/search?q=coalesce&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 262 http://search.yahoo.co.jp/search?p=COALESCE&search.x=1&fr=top_ga1&tid=top_ga1&ei=UTF-8
- 228 http://www.google.co.jp/url?sa=t&rct=j&q=postgres coalesce&source=web&cd=2&sqi=2&ved=0CCMQFjAB&url=http://d.hatena.ne.jp/deeeki/20081212/coalesce&ei=UZafTu2eFNShiQek97DCBg&usg=AFQjCNEZplHTAQY0IbGsMncE1-5NYmrFGQ&sig2=QX7VLN_CiwMmLKlt8TqBjg




