【PostgreSQL】boolean(論理型)について整理してみました

PostgreSQLその他

boolean(論理型)

booleanとは、真偽値を保存できる型です。

 

ざっくりいうと以下のような特徴があります。

・ booleanは3つの値(true , false , null )のみをとる

・ true、falseに対応する数値や文字の値がある

※ 文字の場合、前後のスペースは無視される。 大文字小文字の区別はなし、全角はエラーとなる。

 trueに対応 … TRUE  , 't' , 'true'  , 'y' , 'yes' , 'on' , '1'

 falseに対応 … FALSE , 'f' , 'false' , 'n' , 'no' , 'off' , '0'

・ true , falseに対応できない値を代入しようとした時は、エラーが発生する

・ 次の動作検証でも触れるますが、上の値以外でもtrue , false , nullと判断されるものもある

 

動作検証

次の動作検証は、true、falseに対応する値が他にもあるか検証してみました。

castした結果がエラーとならなければ、それは「true or false or nullと判定できた」ということになります。

 

結果的には、't'だけでなく、'tr'でも'tru'でも'true'でもcastしてエラーにならないため、他にもありそうだということがわかりました。

ただし、統一されていないと可読性の面でも悪いと思うので、プロジェクト単位等では、いずれかの値に統一していたほうがいいと思います。

下の例はそのままコピーして実行できるので試してみて下さい。

--====================================
--booleanにtrueとして代入できる値を検証します
--※エラーになった場合は、trueとならない値だということ
--====================================
select cast(TRUE as boolean);     -- true

--文字列
--※下の例の場合、'o'以外はすべてtrueと同じ扱い
--結果がtrueとなればその文字は'true'と同じ意味となったということ
select cast('t' as boolean);      -- true
select cast('tr' as boolean);     -- true
select cast('tru' as boolean);    -- true
select cast('true' as boolean);   -- true
select cast('y' as boolean);      -- true
select cast('ye' as boolean);     -- true
select cast('yes' as boolean);    -- true
select cast(' yes ' as boolean);  -- true
select cast('o' as boolean);      -- エラー
select cast('on' as boolean);     -- true

--数値、数値の文字列
select cast(1 as boolean);        -- true(0:false、それ以外:true)
select cast(-999 as boolean);     -- true
select cast('1' as boolean);      -- true
select cast('2' as boolean);      -- エラー
select cast('-1' as boolean);     -- エラー

--====================================
--booleanにfalseとして代入できる値を検証します
--※エラーになった場合は、falseとならない値だということ
--====================================
select cast(FALSE as boolean);    -- false

--文字列
select cast('f' as boolean);      -- false
select cast('fa' as boolean);     -- false
select cast('fal' as boolean);    -- false
select cast('fals' as boolean);   -- false
select cast('false' as boolean);  -- false
select cast('n' as boolean);      -- false
select cast('no' as boolean);     -- false

--数値
select cast(0 as boolean);        -- true(0:false、それ以外:true)

--====================================
--空文字、nullの場合を検証
--====================================
select cast('' as boolean);       -- エラー
select cast(null as boolean);     -- null