Пустое значение поля SQL
Значение NULL в SQL означает отсутствие данных,
а не пустую строку.
Колонку без NOT NULL можно оставить незаполненной
при INSERT. Тип столбца проверяют функцией
sqlite3_column_type; для SQLITE_NULL
текст читать не нужно:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("nulls.db", &db) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
char* err = nullptr;
if (sqlite3_exec(
db,
"CREATE TABLE IF NOT EXISTS memos ("
"id INTEGER PRIMARY KEY,"
"title TEXT NOT NULL,"
"remark TEXT"
")",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO memos (title) VALUES ('idea')",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
sqlite3_stmt* stmt = nullptr;
if (sqlite3_prepare_v2(
db,
"SELECT remark FROM memos WHERE id = 1",
-1,
&stmt,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
if (sqlite3_step(stmt) == SQLITE_ROW) {
if (sqlite3_column_type(stmt, 0) == SQLITE_NULL) {
std::cout << "missing\n";
} else {
const char* text =
reinterpret_cast<const char*>(
sqlite3_column_text(stmt, 0)
);
std::cout << text << "\n";
}
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
Тот же столбец можно вывести с запасной строкой,
если тип равен SQLITE_NULL:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("nulls.db", &db) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
sqlite3_stmt* insert = nullptr;
if (sqlite3_prepare_v2(
db,
"INSERT INTO memos (title, remark) VALUES (?, ?)",
-1,
&insert,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
sqlite3_bind_text(insert, 1, "done", -1, SQLITE_STATIC);
sqlite3_bind_text(insert, 2, "shipped", -1, SQLITE_STATIC);
sqlite3_step(insert);
sqlite3_finalize(insert);
sqlite3_stmt* query = nullptr;
if (sqlite3_prepare_v2(
db,
"SELECT remark FROM memos WHERE title = ?",
-1,
&query,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
sqlite3_bind_text(query, 1, "idea", -1, SQLITE_STATIC);
if (sqlite3_step(query) == SQLITE_ROW) {
const char* remark = nullptr;
if (sqlite3_column_type(query, 0) != SQLITE_NULL) {
remark = reinterpret_cast<const char*>(
sqlite3_column_text(query, 0)
);
}
std::cout << (remark ? remark : "none") << "\n";
}
sqlite3_finalize(query);
sqlite3_close(db);
return 0;
}
Создайте таблицу items в stock.db
с обязательным sku и необязательным
comment, добавьте строку без комментария
и выведите "empty", если поле пустое.
Добавьте строку с комментарием "fragile"
и выведите текст для обеих записей, подставив
строку по умолчанию, если поле пустое.