Выбор части столбцов в SQLite
Звездочка * в SELECT тянет все колонки.
Чаще перечисляют явный список - так меньше данных и проще читать результат. Таблица может хранить служебные поля, которые в отчет не попадают. В запросе оставляют только нужные имена:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("partial_view.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 devices ("
"id INTEGER PRIMARY KEY,"
"serial TEXT NOT NULL,"
"note TEXT,"
"warranty_until TEXT"
")",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO devices (serial, note, warranty_until) "
"VALUES ('SN-44', 'lab unit', '2027-01-01')",
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 serial, warranty_until FROM devices",
-1,
&stmt,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
while (sqlite3_step(stmt) == SQLITE_ROW) {
const char* serial =
reinterpret_cast<const char*>(
sqlite3_column_text(stmt, 0)
);
const char* until =
reinterpret_cast<const char*>(
sqlite3_column_text(stmt, 1)
);
std::cout << serial << "\n";
std::cout << until << "\n";
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
Порядок имен в списке задает порядок столбцов
в результате. Для одного значения по условию
удобен подготовленный SELECT с параметром:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("partial_view.db", &db) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
sqlite3_stmt* query = nullptr;
if (sqlite3_prepare_v2(
db,
"SELECT note FROM devices WHERE serial = ?",
-1,
&query,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
sqlite3_bind_text(query, 1, "SN-44", -1, SQLITE_STATIC);
if (sqlite3_step(query) == SQLITE_ROW) {
const char* note =
reinterpret_cast<const char*>(
sqlite3_column_text(query, 0)
);
std::cout << note << "\n";
}
sqlite3_finalize(query);
sqlite3_close(db);
return 0;
}
Создайте таблицу lots в batch.db
с полями code, qty и comment,
добавьте партию и выведите только code
и qty.
Выведите comment для партии с кодом
"B-12", не выбирая остальные столбцы.