Подтвердить что ты не робот

SQLite: связывает список значений с "WHERE col IN (: PRM)"

все, что я хочу сделать, это отправить запрос, например

SELECT * FROM table WHERE col IN (110, 130, 90);

Итак, я подготовил следующее утверждение

SELECT * FROM table WHERE col IN (:LST);

Затем я использую

sqlite_bind_text(stmt, 1, "110, 130, 90", -1, SQLITE_STATIC);

К сожалению, это становится

SELECT * FROM table WHERE col IN ('110, 130, 90');

и бесполезен (обратите внимание на две дополнительные одинарные кавычки). Я уже пытался помещать лишние строки в строку, но они ускользают. Я не нашел возможности отключить экранирование или предотвратить включение текста в одинарные кавычки. Последнее, о чем я могу думать, это не использование подготовленного заявления, но я бы воспринял его как последний вариант. Есть ли у вас какие-либо идеи или предложения?

Спасибо

Edit:

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

4b9b3361

Ответ 1

Вы можете динамически строить параметризованный оператор 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.

Ответ 2

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

SELECT * FROM TABLE WHERE col IN (SELECT col FROM temporarytable);

Ответ 3

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

"SELECT * FROM TABLE WHERE col IN ("+",".join(["?"]*len(lst))+")"

Ответ 4

Работа с одной и той же функциональностью приводит меня к такому подходу: (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();
            });
        });
    };

Ответ 5

Например, если вам нужен запрос 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 )

Ответ 6

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

let myList = [1, 2, 3];
`SELECT * FROM table WHERE col IN (${myList.join()});`

Ответ 7

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

Предположим, что в массиве есть id и некоторый обратный вызов 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);

Ответ 8

Вы можете попробовать это

RSQLite in R:
lst <- c("a", "b", "c")

dbGetQuery(db_con, paste0("SELECT * FROM table WHERE col IN (", paste0(shQuote(lst), collapse=", ") , ");"))

Ответ 9

Вы не можете передать массив как один параметр, но вы можете передать каждое значение массива как отдельный параметр (IN (?, ?, ?)).

Безопасный способ сделать это для параметров динамического числа (вы не должны использовать конкатенацию строк, .format() и т.д. Для вставки самих значений в запрос, это может привести к SQL-инъекциям) - генерировать строку запроса с нужным номером. из ? заполнителей, а затем связать элементы массива. Используйте конкатенацию массивов или синтаксис распространения (* или ... в большинстве языков), если вам нужно передать и другие параметры.

Вот пример для Python 3:

c.execute('SELECT * FROM TABLE WHERE col IN ({}) LIMIT ?'
       .format(', '.join(['?'] * len(values))), [*values, limit])