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 で検証しています。