INTEGER型とTINYINT型でブール値を格納
SQLite にブール値を格納する方法
ブール値 は、真偽を表す値であり、SQLite では以下の方法で格納できます。
INTEGER 型として格納
- 0 は FALSE
- 1 は TRUE
例:
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
is_active INTEGER
);
-- INSERT 文
INSERT INTO users (name, is_active) VALUES ("John Doe", 1);
-- SELECT 文
SELECT * FROM users WHERE is_active = 1;
INTEGER 型とほぼ同じですが、TINYINT 型は 1 バイトのみ使用するため、メモリ使用量を抑えられます。
BOOLEAN 型として格納
SQLite 3.35 以降では、BOOLEAN 型が正式にサポートされました。
- TRUE
- FALSE
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
is_active BOOLEAN
);
-- INSERT 文
INSERT INTO users (name, is_active) VALUES ("John Doe", TRUE);
-- SELECT 文
SELECT * FROM users WHERE is_active = TRUE;
- "true" は TRUE
- "false" は FALSE
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
is_active TEXT
);
-- INSERT 文
INSERT INTO users (name, is_active) VALUES ("John Doe", "true");
-- SELECT 文
SELECT * FROM users WHERE is_active = "true";
どの方法を使用しても、SQLite にブール値を格納することができます。どの方法を選択するかは、個人やプロジェクトの要件によって異なります。
ヒント
- 一貫性のため、プロジェクト全体で同じ方法を使用することをお勧めします。
- 多くの場合、BOOLEAN 型または INTEGER 型を使用するのが最も簡単です。
- TEXT 型は、ブール値がデータベースに格納される前に変換される必要がある場合にのみ使用します。
Python
import sqlite3
# データベース接続
connection = sqlite3.connect("mydb.sqlite")
cursor = connection.cursor()
# テーブル作成
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
is_active INTEGER
);
""")
# データ挿入
cursor.execute("""
INSERT INTO users (name, is_active) VALUES (?, ?)
""", ("John Doe", 1))
# データ取得
cursor.execute("""
SELECT * FROM users WHERE is_active = ?
""", (1,))
for row in cursor.fetchall():
print(row)
# コミットとクローズ
connection.commit()
connection.close()
JavaScript
const sqlite3 = require('sqlite3').verbose();
// データベース接続
const db = new sqlite3.Database("mydb.sqlite");
// テーブル作成
db.run(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
is_active INTEGER
);
`);
// データ挿入
db.run(`
INSERT INTO users (name, is_active) VALUES (?, ?)
`, ["John Doe", 1]);
// データ取得
db.all(`
SELECT * FROM users WHERE is_active = ?
`, [1], (err, rows) => {
if (err) {
console.error(err);
} else {
console.log(rows);
}
});
// 終了
db.close();
C++
#include <iostream>
#include <sqlite3.h>
int main() {
// データベース接続
sqlite3 *db;
int rc = sqlite3_open("mydb.sqlite", &db);
if (rc != SQLITE_OK) {
std::cerr << "Error opening database: " << sqlite3_errmsg(db) << std::endl;
return 1;
}
// テーブル作成
sqlite3_stmt *stmt;
rc = sqlite3_prepare_v2(db, "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, is_active INTEGER)", -1, &stmt, NULL);
if (rc != SQLITE_OK) {
std::cerr << "Error creating table: " << sqlite3_errmsg(db) << std::endl;
sqlite3_finalize(stmt);
sqlite3_close(db);
return 1;
}
rc = sqlite3_step(stmt);
sqlite3_finalize(stmt);
// データ挿入
rc = sqlite3_prepare_v2(db, "INSERT INTO users (name, is_active) VALUES (?, ?)", -1, &stmt, NULL);
if (rc != SQLITE_OK) {
std::cerr << "Error preparing insert statement: " << sqlite3_errmsg(db) << std::endl;
sqlite3_finalize(stmt);
sqlite3_close(db);
return 1;
}
sqlite3_bind_text(stmt, 1, "John Doe", -1, SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 2, 1);
rc = sqlite3_step(stmt);
sqlite3_finalize(stmt);
// データ取得
rc = sqlite3_prepare_v2(db, "SELECT * FROM users WHERE is_active = ?", -1, &stmt, NULL);
if (rc != SQLITE_OK) {
std::cerr << "Error preparing select statement: " << sqlite3_errmsg(db) << std::endl;
sqlite3_finalize(stmt);
sqlite3_close(db);
return 1;
}
sqlite3_bind_int(stmt, 1, 1);
while (rc == SQLITE_ROW) {
int id = sqlite3_column_int(stmt, 0);
const char *name = sqlite3_column_text(stmt, 1);
int is_active = sqlite3_column_int(stmt, 2);
std::cout << "id: " << id << ", name: " << name << ", is_active: " << is_active << std::endl;
rc = sqlite3_step(stmt);
}
SQLite にブール値を格納するその他の方法
ビットフィールドを使用する
SQLite では、ビットフィールドを使用して複数のブール値を 1 つのバイトに格納できます。これは、ストレージスペースを節約したい場合に役立ちます。
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
flags INTEGER
);
-- フラグを設定
UPDATE users SET flags = flags | 0x01 WHERE id = 1;
-- フラグが設定されているかどうかを確認
SELECT flags & 0x01 FROM users WHERE id = 1;
ENUM 型を使用する
SQLite 3.35 以降では、ENUM 型が正式にサポートされました。ENUM 型は、有限個の値のリストから値を選択できるデータ型です。
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
is_active ENUM('true', 'false')
);
-- データ挿入
INSERT INTO users (name, is_active) VALUES ("John Doe", 'true');
-- データ取得
SELECT * FROM users WHERE is_active = 'true';
独自のデータ型を作成する
SQLite では、独自のデータ型を作成することもできます。これは、特殊な要件がある場合に役立ちます。
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
is_active BOOLEAN
);
-- 独自のデータ型
CREATE TYPE BOOLEAN AS INTEGER;
-- データ挿入
INSERT INTO users (name, is_active) VALUES ("John Doe", 1);
-- データ取得
SELECT * FROM users WHERE is_active = 1;
どの方法を使用するかは、個人の要件やプロジェクトの要件によって異なります。
- 多くの場合、最も簡単な方法は、INTEGER 型または BOOLEAN 型を使用することです。
- ビットフィールドは、ストレージスペースを節約したい場合に役立ちます。
- ENUM 型は、有限個の値のリストから値を選択できる場合に役立ちます。
- 独自のデータ型は、特殊な要件がある場合にのみ作成する必要があります。
sqlite