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

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

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');

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

Спасибо

Редактировать:

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

Ответы на вопрос(8)

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

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

SELECT * FROM TABLE WHERE col IN (SELECT col FROM temporarytable);
 Sebastian03 июн. 2012 г., 16:13
Есть ли у вас сравнения производительности? Я могу себе представить, что накладные расходы на создание временной таблицы перевешивают создание плана выполнения. Это, однако, будет зависеть от размеров таблицы. Я думаю, можно было бы сохранить временную таблицу, очистить ее и использовать повторно каждый раз (при условии правильной синхронизации). Тем не менее это будет заполнение против плана выполнения
 Timothy C. Quinn11 нояб. 2016 г., 21:55
Это сладкое решение. Ускорены мои порядки кода сравнения таблицы сравнения.

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

"SELECT * FROM TABLE WHERE col IN ("+",".join(["?"]*len(lst))+")"
 Sebastian29 мар. 2013 г., 18:07
Что это за язык? Ява?!
 xtin26 апр. 2013 г., 16:53
это питон Какой язык вы ищете?

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 )
Решение Вопроса

Вы можете динамически построить параметризованный оператор 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.
 Sebastian26 янв. 2011 г., 19:41
Хорошо, еще раз спасибо.
 Sebastian26 янв. 2011 г., 01:16
Спасибо за ваш ответ. Я не упомянул об этом в своем первоначальном сообщении (только что отредактирован), но количество параметров является динамическим. Я на самом деле все еще воспринимаю ваш ответ как «невозможный», что означает, что я просто не могу использовать подготовленное утверждение.
 Larry Lustig26 янв. 2011 г., 01:51
Нет, Себастьян, я предлагаю динамически построить инструкцию SQL с переменным числом параметров, а затем вызывать sqlite_bind_in в цикле для каждого параметра. Это должно работать для вас. Я добавлю псевдокод в ответ.
 Larry Lustig26 янв. 2011 г., 13:46
Нет, вам обязательно придется каждый раз подготавливать заявление. Там нет никакого способа заявлениямог быть готовым, не зная, сколько значений будет в предложении IN () (эта информация, предположительно, вносит вклад в план выполнения).
 Sebastian26 янв. 2011 г., 09:06
Чтобы иметь возможность вызывать sql_bind_ *, сначала нужно вызвать sql_prepare. Я не вижу смысла в динамическом построении оператора, его подготовке, использовании связывания, выполнении и завершении, вместо вставки параметров непосредственно при построении запроса, подготовке, выполнении и завершении. В любом случае мне нужно будет вызывать sql_prepare каждый раз, когда я хочу выполнить запрос, и это то, что я хотел бы сохранить и сделать только один раз.

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

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

let myList = [1, 2, 3];
`SELECT * FROM table WHERE col IN (${myList.join()});`
 jasonseminara01 янв. 2018 г., 22:52
Это действительно плохая идея, чтобы вручную вводить данные в запрос во время выполнения. Это серьезная угроза безопасности, которая оставляет вас открытыми для атаки с использованием SQL-инъекций.netsparker.com/blog/web-security/sql-injection-cheat-sheet

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

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

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

Ваш ответ на вопрос