sqlite 参数绑定和IN运算符

nimxete2  于 2023-01-05  发布在  SQLite
关注(0)|答案(1)|浏览(149)

我很确信这是不可能的,但以防万一:
如何绑定IN运算符的右(list)参数?

SELECT foo FROM bar WHERE baz IN ('cow', 'chicken');

不幸的是,这并不奏效:

list = ['cow', 'chicken']
db.execute('SELECT foo FROM bar WHERE baz IN ?', list)

参数绑定不仅比直接插值更美观,而且更安全:使用它的一个主要原因是为了停止臭名昭著的Bobby Tables。但是,您是否坚持手动转义IN参数?

list = ['cow', 'chicken']
sqllist = list.map { |el| "'#{SQLite3::Database.quote(el)}'" }.join(',')
db.execute('SELECT foo FROM bar WHERE baz IN (#{sqllist})')

(The例子是Ruby with sqlite3 gem,但这个问题实际上适用于所有为您进行参数绑定的语言/库。)

b4qexyjb

b4qexyjb1#

传递给db.execute的SQL只是一个字符串,占位符的数量只需要与传递给它的值的数量相匹配,因此,可以基于list.length构建占位符,然后使用字符串插值将其放入:

placeholders = Array.new(list.length, '?').join(',')
db.execute("SELECT foo FROM bar WHERE baz IN (#{placeholders})", list)

这是非常安全的,因为您确切地知道placeholders中的内容。

相关问题