nodejs sqlite, как использовать WHERE IN со списком [duplicate]

Это означает, что вы пытаетесь манипулировать тем, что имеет ссылку, но еще не инициализировано. Первое, что нужно сделать, это проверить каждый созданный экземпляр. Используйте контрольные точки, часы, проверяйте свои значения varibale. Следить за трассировкой стека и искать точные строки и столбцы, которые создают проблему

28
задан Sebastian 26 January 2011 в 01:11
поделиться

7 ответов

Вы можете динамически строить параметризованный оператор SQL формы

 SELECT * FROM TABLE WHERE col IN (?, ?, ?)

, а затем вызывать sqlite_bind_int один раз для каждого «?» вы добавили в оператор.

Невозможно напрямую привязать текстовый параметр к множеству целочисленных (или, если на то пошло, нескольких текстовых) параметров.

Вот псевдокод для чего Я имею в виду:

-- Args is an array of parameter values
for i = Lo(Args) to Hi(Args)
   paramlist = paramlist + ', ?'

sql = 'SELECT * FROM TABLE WHERE col IN (' + Right(paramlist, 3)  + ')'

for i = Lo(Args) to Hi(Args)
  sql_bind_int(sql, i, Args[i]

-- execute query here.
24
ответ дан Larry Lustig 27 August 2018 в 01:09
поделиться

Я сам сам столкнулся с этим вопросом, но ответил на это, создав временную таблицу и вставив в нее все значения, чтобы я мог тогда:

SELECT * FROM TABLE WHERE col IN (SELECT col FROM temporarytable);
9
ответ дан hatfinch 27 August 2018 в 01:09
поделиться

Более простой и безопасный ответ просто включает в себя создание маски (в отличие от части данных запроса) и позволяет механизму форматирования SQL-инъекций выполнять свою работу.

Предположим, что у нас есть некоторые id s в массиве и некоторый обратный вызов cb:

/* we need to generate a '?' for each item in our mask */
const mask = Array(ids.length).fill('?').join();

db.get(`
  SELECT *
    FROM films f
   WHERE f.id
      IN (${mask})
`, ids, cb);
0
ответ дан jasonseminara 27 August 2018 в 01:09
поделиться

это прекрасно работает (Javascript ES6):

let myList = [1, 2, 3];
`SELECT * FROM table WHERE col IN (${myList.join()});`
0
ответ дан Moritz 27 August 2018 в 01:09
поделиться

Например, если вы хотите выполнить запрос sql:

select * from table where col in (110, 130, 90)

Что относительно:

my_list = [110, 130, 90]
my_list_str = repr(my_list).replace('[','(').replace(']',')') 
cur.execute("select * from table where col in %s" % my_list_str )
0
ответ дан pgalilea 27 August 2018 в 01:09
поделиться

Работа над такой же функциональностью приводит меня к такому подходу: (nodejs, es6, Promise)

    var deleteRecords = function (tblName, data) {
        return new Promise((resolve, reject) => {
            var jdata = JSON.stringify(data);
            this.run(`DELETE FROM ${tblName} WHERE id IN (?)`, jdata.substr(1, jdata.length - 2), function (err) {
                err ? reject('deleteRecords failed with : ' + err) : resolve();
            });
        });
    };
0
ответ дан Reza Afzalan 27 August 2018 в 01:09
поделиться

Еще проще, постройте свой запрос следующим образом:

"SELECT * FROM TABLE WHERE col IN ("+",".join(["?"]*len(lst))+")"
5
ответ дан xtin 27 August 2018 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: