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

时间:2012-03-26 09:23:39

标签: 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);
});

然而,我知道常规的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);
});

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

所以有人能看出我做错了吗?

2 个答案:

答案 0 :(得分: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...
});

此处有更多信息: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   ?,?,?,?,?
然而,这可以使用我们项目中的underscore.js库。

答案 1 :(得分:0)

好的答案。阅读官方文档中的解释很有意思。

我看到这个问题在2012年得到了解答。我在谷歌37中尝试了它,正如它所推荐的那样,这就是我得到的。

输入数据:(我用黑色铅笔勾勒出来)

enter image description here

Chrome抱怨:

enter image description here

因此它接受尽可能多的问题符号,因为给出了许多输入参数。 (让我们注意虽然数组被传递,但它被视为一个参数)

最终我找到了这个解决方案:

    var activeItemIds = [1,2,3];
    var q = ""; 
    for (var i=0; i< activeItemIds.length; i++) {
        q += '"' + activeItemIds[i] + '", ';
    }        
     q= q.substring(0, q.length - 2); 

     var query = 'SELECT "id" FROM "products" WHERE "id"  IN (' + q + ')';
    _db.transaction(function (tx) {
        tx.executeSql(query, [], function (tx, results1) {
            console.log(results1);
            debugger;

        }, function (a, b) {
            console.warn(a);
            console.warn(b);
        })
    })