Условие в SQL-выборке
Ключевое слово WHERE оставляет только строки,
где предикат истинен.
Значение из программы безопаснее передавать через
"?", а не вшивать в текст. Подготовленный
SELECT с одним параметром ищет записи
по совпадению поля:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("filter_demo.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 tags ("
"id INTEGER PRIMARY KEY,"
"name TEXT NOT NULL,"
"group_code TEXT NOT NULL"
")",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO tags (name, group_code) "
"VALUES ('alpha', 'g1')",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO tags (name, group_code) "
"VALUES ('beta', 'g2')",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
sqlite3_stmt* query = nullptr;
if (sqlite3_prepare_v2(
db,
"SELECT name FROM tags WHERE group_code = ?",
-1,
&query,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
sqlite3_bind_text(query, 1, "g1", -1, SQLITE_STATIC);
while (sqlite3_step(query) == SQLITE_ROW) {
const char* name =
reinterpret_cast<const char*>(
sqlite3_column_text(query, 0)
);
std::cout << name << "\n";
}
sqlite3_finalize(query);
sqlite3_close(db);
return 0;
}
Смена аргумента меняет набор строк без нового SQL.
Числовые поля сравнивают через sqlite3_bind_int
и операторы вроде >=:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("filter_demo.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 name FROM tags "
"WHERE group_code = ? AND id >= ?",
-1,
&query,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
sqlite3_bind_text(query, 1, "g2", -1, SQLITE_STATIC);
sqlite3_bind_int(query, 2, 1);
while (sqlite3_step(query) == SQLITE_ROW) {
const char* name =
reinterpret_cast<const char*>(
sqlite3_column_text(query, 0)
);
std::cout << name << "\n";
}
sqlite3_finalize(query);
sqlite3_close(db);
return 0;
}
Создайте таблицу shifts в plant.db
с полями worker, shift_code
и hours, добавьте три строки и выведите
имена, где hours не меньше 8.
Выведите имена смен с кодом смены "night",
используя параметр в условии по полю
shift_code.