SQLのboolean型についてまとめています。
以下のサンプルSQLは、MySQL8.0.18を前提としています。
データ型booleanを使ったサンプルSQL
Oracle、MySQL、PostgreSQLではTrue/Falseを扱うデータ型Booleanが使用可能です。SQL Serverでは、同等のbit型を使うことができます。bit型は1と0を取り扱い可能です。
まずは、テスト用のテーブルboolean_testを作成しましょう。
mysql> create table boolean_test ( id varchar(4), value boolean ); Query OK, 0 rows affected (0.06 sec) mysql> desc boolean_test; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | varchar(4) | YES | | NULL | | | value | tinyint(1) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ mysql> show create table boolean_test; +--------------+--------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +--------------+--------------------------------------------------------------------------------------------------------------------------------------+ | boolean_test | CREATE TABLE `boolean_test` ( `id` varchar(4) DEFAULT NULL, `value` tinyint(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=sjis | +--------------+--------------------------------------------------------------------------------------------------------------------------------------+mysql> insert boolean_test (id, value) values ('0001',(true));
テーブルboolean_testは、varchar(4)のidと、boolean型のvalueの2カラムで構成しています。MySQLでは、booleanはtinyint型に置き換えられます。tinyintは0と1以外の値を格納することが可能なので、厳密なboolean型を扱うには挿入・更新時に値チェックが必要になります。Oracle、PostgreSQLではboolean型が提供されています。
テーブルboolean_testに以下のデータを挿入します。
- 0001 , 1
- 0002, 0
- 0003, NULL
mysql> insert boolean_test (id, value) values ('0001',1); Query OK, 1 row affected (0.00 sec) mysql> insert boolean_test (id, value) values ('0002',0); Query OK, 1 row affected (0.00 sec) mysql> insert boolean_test (id, value) values ('0003',null); Query OK, 1 row affected (0.01 sec)
MySQLでは、(true)は1、(false)は0として扱われます。テーブルに格納される値は以下のようになります。
mysql> select * from boolean_test; +------+-------+ | id | value | +------+-------+ | 0001 | 1 | | 0002 | 0 | | 0003 | NULL | +------+-------+
where条件で、is true、is false、is null、is not trueを指定したときの結果は以下のようになります。
mysql> select * from boolean_test where value is true; +------+-------+ | id | value | +------+-------+ | 0001 | 1 | +------+-------+ mysql> select * from boolean_test where value is false; +------+-------+ | id | value | +------+-------+ | 0002 | 0 | +------+-------+ mysql> select * from boolean_test where value is null; +------+-------+ | id | value | +------+-------+ | 0003 | NULL | +------+-------+ mysql> select * from boolean_test where value is not true; +------+-------+ | id | value | +------+-------+ | 0002 | 0 | | 0003 | NULL | +------+-------+
insert時の値には(true)と(false)が使えます。以下のSQLは、次の2つのデータを挿入したときの例です。
- 0004 , (true)
- 0005, (false)
mysql> insert boolean_test (id, value) values ('0004',(true)); Query OK, 1 row affected (0.01 sec) mysql> insert boolean_test (id, value) values ('0005',(false)); Query OK, 1 row affected (0.03 sec) mysql> select * from boolean_test; +------+-------+ | id | value | +------+-------+ | 0001 | 1 | | 0002 | 0 | | 0003 | NULL | | 0004 | 1 | | 0005 | 0 | +------+-------+
データベースによっては、on、off、t、fなどが使えます。
まとめ
- boolean型は真(1)、偽(0)、NULLの3値を取ることができる
- データーベースによってboolean型の実装には違いがある。MySQLでは実体はtinyintとなる。
- where条件で真以外を指定するには、is not trueなどを指定し、偽とNULLを含める必要あり
- データベースによって、真偽値はtrue、falseなどが使える