2017-03-12 2 views
1

C-APISQLite3およびjson1拡張子を使用しています。データベース内では、整数リストはjson_arrayとして格納されます。 json_extract関数を使用して、json_arrayからCの整数配列を作成したいとします。私は、SQLステートメントのインデックスをインクリメントしてjson配列の各値をループしています。例として、考える:Cプログラムでjson配列インデックスをsqlite3のバインドされたパラメータとして設定するには?

CREATE TABLE mytable (label INTEGER PRIMARY KEY, list TEXT); 
INSERT INTO mytable VALUES (1, json(json_array(1,2,3))); 

SELECT json_extract(list, '$[index]') FROM mytable WHERE label == 1; 
---Example: the result for index=0 is the integer: 1 

をスニペットに示すように、私は現在、バインドされたパラメータとして、'$[index]'、コマンドの単一引用符で囲まれ部分を表現する文字列を作成しています以下。

sprintfを使用してインデックスを設定することはできますか?または、これは容認できる解決策ですか?

char *sql = "select json_extract(list, ?) from mytable where label == 1"; 
char *index_param = (char *)malloc(80); 

// OTHER STUFF: prepare sql stmt, etc, etc... 

for (int i=0; i<n; i++) { /* n is the number of values in the json list */ 

    /* Is sprintf the best thing to do here? */ 
    index_length = sprintf(index_param, "$[%d]", i); 

    sqlite3_bind_text(stmt, 1, index_param, index_length+1, SQLITE_STATIC); 
    result = sqlite3_step(stmt); 
    values[i] = sqlite3_column_int(stmt, 0); 
    sqlite3_reset(stmt); 
} 

答えて

0

あなたが唯一の整数パラメータがあるようにあなたは、SQLパスを構築することができます:

SELECT json_extract(list, '$[' || ? || ']') FROM ... 

をしかし、json_each()機能と直接配列の値を読み取るために良いアイデアのようになります。

const char *sql = "SELECT value FROM MyTable, json_each(MyTable.list) WHERE ..."; 
// prepare ... 
for (;;) { 
    rc = sqlite3_step(stmt); 
    if (rc != SQLITE_ROW) 
     break; 
    values[i++] = sqlite3_column_int(stmt, 0); 
} 
+0

** json_each()** fcnは非常に便利で、あなたの答えは私を解決に導きました!しかし、適切な動作を得るために、 '!='の代わりに 'if(rc == SQLITE_DONE)break;を使用しました。 –

+0

申し訳ありませんが、これはROWだったはずです。 DONEを指定すると、エラーが発生しても終了しません。 –

関連する問題