【PostgreSQL】boolean(論理型)について整理してみました
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