websql использует select для получения строк из массива - PullRequest
0 голосов
/ 26 марта 2012

в 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].в противном случае нам потребовалось бы добавить динамическое количество вопросительных знаков (столько, сколько имеется идентификаторов в массиве).

, поэтому кто-нибудь может увидеть, что я делаю неправильно?

Ответы [ 2 ]

6 голосов
/ 04 апреля 2012

очевидно, что нет другого решения, кроме как вручную добавить знак вопроса для каждого элемента в вашем массиве.

это на самом деле в спецификации на 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 , которая естьнаш проект.

0 голосов
/ 08 октября 2014

Хороший ответ. Было интересно почитать объяснение в официальной документации.

Я вижу, что на этот вопрос был дан ответ в 2012 году. Я попробовал его в Google 37 именно так, как это было рекомендовано, и вот что я получил.

Данные по вводу: (я обрисовал их черным карандашом)

enter image description here

Хром жалуется:

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);
        })
    })
...