EatSmartシステム部ブログ

ウェブサイトの開発や運営に関する情報です。

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「論理値データ型」

www.postgresql.jp