postgresqlでのbooleanの判定について
あるテーブルでboolean型のカラムに対して以下の様にselectしてみたところ期待した(NULLのレコードも含めた)結果が返却されませんでした。
SELECT * TABLE_NAME WHERE COLUMN_NAME <> TRUE;
上記に対して、boolean型のカラムにデフォルト値(TRUE or FALSE)を設定するこを考えたのですが、サービス稼働中の既存テーブルでレコード数が多く且つテーブルにUPDATEのTRIGGERを設定していることを考慮し、判定条件で回避出来ないか考えてみました。
直ぐに思いつく策として、以下の様にORで「is null」の判定条件追加すれば返却される様になったのですが
SELECT * TABLE_NAME WHERE COLUMN_NAME = FALSE OR COLUMN_NAME IS NULL;
他の判定条件がないか調べてみた所、以下の様にすることでNULLレコードも含めた結果が返却されるようになりました。
SELECT * TABLE_NAME WHERE COLUMN_NAME IS NOT TRUE;
つまりboolean型にも、"真(TRUE)"もしくは"偽(FALSE)"以外に"不明(NULL)"の状態が存在して、NULLの状態を含めて取得する場合は
カラム名 != (TRUEもしくはFALSE) カラム名 <> (TRUEもしくはFALSE) ではなく カラム名 is not (TRUEもしくはFALSE)
とする必要があります。
(参考)PostgreSQL 9.0.4「論理値データ型」