[PostgreSQL] text型のNULL検索 | 親鶏と酒とエンジニアリングと私

親鶏と酒とエンジニアリングと私

自分的に苦労したり新しいと思ったりGoogle先生が答えてくれない技術系の悩みについての解決策を模索していくブログです。

PostgreSQLでtext型の列に画像などのバイナリデータを入れておくケースはあると思います。

その場合にその列にデータが入っていないものだけを抽出したいという場合、

TABLE1のVALUEという列が対象の列だとすると、普通は



SELECT ID FROM TABLE1 WHERE VALUE IS NULL OR VALUE = '';
SELECT ID FROM TABLE1 WHERE NOT VALUE IS NULL OR VALUE <> '';




というような書き方をすると思います。

しかし残念ながらPostgreSQLにてtext型のカラムに対して

「IS NULL」
「= ''」
「<> ''」

といった記述をすると、インデックスが効かないのか、中身をすべて精査するのか、、、
理由は判りませんが、とにかく非常に検索が遅くなってしまうのです。
※件数が少ない場合は問題ないかもしれませんが、多くなると本当に遅い!!

これを回避するにはこのように書いてあげれば良いです。



SELECT ID FROM TABLE1 WHERE BIT_LENGTH(VALUE) = 0;
SELECT ID FROM TABLE1 WHERE BIT_LENGTH(VALUE) <> 0;




「BIT_LENGTH」関数を使ってあげると、NULLでも空文字列でも「0」を返してくれます。

こうすると、数万件が対象でも一瞬で結果が返ってくるようになります。
text型への登録有無の検索で悩んでいる方は是非ともお試しあれ。



※本記事は PostgreSQL 8.4 で検証しています。