Я отвечаю на свой вопрос, когда, наконец, нашел удовлетворительное решение.
Я решил использовать временную таблицу:
sqlite3_exec(db, "CREATE TEMP TABLE kv (k, v);", NULL, NULL, NULL);
Я заполняю временную таблицу своим JSON пары ключ / значение:
sqlite3_prepare_v2(db, "INSERT INTO kv VALUES (:1, :2);", -1, &stmt, NULL);
sqlite3_bind_text(stmt, 1, key, -1, SQLITE_STATIC);
sqlite3_bind_int(stmt, 2, value); // Bind by value type.
sqlite3_step(stmt);
Эта временная таблица затем используется для заполнения столбца j
таблицы t
:
sqlite3_prepare_v2(db, "INSERT INTO t (i, j) VALUES (:1, (SELECT json_group_object(k, v) FROM kv));", -1, &stmt, NULL);
sqlite3_bind_int(stmt, 1, 42); // Set value for column i.
sqlite3_step(stmt);
Вот полная последовательность SQL операторы, которые иллюстрируют подход:
CREATE TABLE t (i INTEGER, j TEXT);
CREATE TEMP TABLE kv (k, v);
INSERT INTO kv VALUES ('k1', 7);
INSERT INTO kv VALUES ('k2', 'hello');
INSERT INTO kv VALUES ('k3', 1.23);
INSERT INTO t (i, j) VALUES (42, (SELECT json_group_object(k, v) FROM kv));
SELECT * FROM t;
Выход из последнего оператора выбора - 42|{"k1":7,"k2":"hello","k3":1.23}
.