0

永続ストレージをSQLiteに依存するWebベースのアプリのフィルター関数を作成しようとしています。プリペアドステートメントを使用しようとしていますが、ユーザーがチェックしたボックスの数に基づいて動的に作成する必要があります。動的に追加するクエリを作成しましたか?プレースホルダー( IN句とプレースホルダーからの提案を使用)。

正しい場所に正しい数の?を作成することはできましたが、[...]内のパラメーターに値を追加する方法がわかりません。

[...]内のすべてのパラメーター値を保持する変数を使用すると、「ステートメント文字列内の「?」の数が引数文字列と一致しません」というエラーが発生します。また、プレースホルダーのセットごとに1つの変数を使用してみました。それもうまくいきませんでした。プレースホルダーの数がパラメーターの数と照合され、変数が読み取られる前にエラーが返されると思います。

// just spaced it with returns and removed the +'s and "'s to make it easier to read
var filterQuery =   SELECT t1.col1, t1.col2, t1.col3, t2.col2, t3.col2
                    FROM t1, t2, t3
                    WHERE t1.col2 = ? 
                    AND t1.col3 IN ( ?, ?, ?)
                    AND t2.col2 IN ( ?, ?, ?, ?)

コード:

db.transaction(function(tx) {
    tx.executeSql(
        filterQuery,
        [/* what do I put in here so that the number of ?s matches with the number of parameters? */],
        success,
        failure
    );
});

パラメータを動的に挿入して、プレースホルダーの数と一致させ、不一致エラーを回避するにはどうすればよいですか?

明確化:プリペアドステートメントなしでクエリを正常に実行しました。私はそれらを使用できるようになるソリューションを望んでいます。

(ボーナス質問-このクエリは、私が期待していることを実行しますか?つまり、ユーザーが行ったすべての選択に一致する行のみを取得しますか?)

前もって感謝します!

4

1 に答える 1

0

最も速い方法は、動的 SQL 内で疑問符 ( ?)の代わりに実際のパラメーター値を使用することです。

WHERE t1.col2 = 'searchstring' 
AND t1.col3 IN ( 12, 23, 24)
AND t2.col2 IN ( 'value', 'onemorevalue', 'x', 'y')
于 2012-07-26T08:14:17.993 に答える