websql使用select in从数组中获取行

San*_*der 0 sql sqlite web-sql

在websql中,我们可以像这样请求某一行:

tx.executeSql('SELECT * FROM tblSettings where id = ?', [id], function(tx, rs){
    // do stuff with the resultset.
},
function errorHandler(tx, e){
    // do something upon error.
    console.warn('SQL Error: ', e);
});
Run Code Online (Sandbox Code Playgroud)

但是,我知道常规的SQL,并认为我应该能够请求

var arr = [1, 2, 3];
tx.executeSql('SELECT * FROM tblSettings where id in (?)', [arr], function(tx, rs){
    // do stuff with the resultset.
},
function errorHandler(tx, e){
    // do something upon error.
    console.warn('SQL Error: ', e);
});
Run Code Online (Sandbox Code Playgroud)

但这没有给我们任何结果,结果总是空的.如果我将删除[arr]arr,然后sql将获得可变数量的参数,所以我认为它应该是[arr].否则它将要求我们添加动态数量的问号(与数组中的id一样多).

那么有谁能看到我做错了什么?

San*_*der 6

显然,除了为数组中的每个项目手动添加问号之外,没有其他解决方案.

这实际上是在w3.org的规范中

var q = "";
for each (var i in labels)
  q += (q == "" ? "" : ", ") + "?";

// later to be used as such:
t.executeSql('SELECT id FROM docs WHERE label IN (' + q + ')', labels, function (t, d) {
  // do stuff with result...
});
Run Code Online (Sandbox Code Playgroud)

更多信息:http://www.w3.org/TR/webdatabase/#introduction(在介绍的最后)

但是,目前我创建了一个帮助函数,为我创建这样一个字符串可能比上面更好,可能没有,我还没有做过任何性能测试.

这就是我现在用的东西

var createParamString = function(arr){
  return _(arr).map(function(){ return "?"; }).join(',');
}

// when called like this:
createparamString([1,2,3,4,5]);  // >> returns   ?,?,?,?,?
Run Code Online (Sandbox Code Playgroud)

然而,这使用了我们项目中的underscore.js库.