你想用
DBI::sqlInterpolate
用于生成动态查询。这比不安全地将查询粘贴在一起要好。但是它对矢量输入不起作用,所以,
dbplyr::translate_sql
如果你能忍受更多的包导入,那就足够了。例子:
require(DBI)
require(dbplyr)
con <- dbConnect(RSQLite::SQLite(), dbname = ":memory:")
month_input <- SQL(!!translate_sql(month.abb))
# Or if you don't like lazy-eval NSE nonsense
month_input <- dbplyr:::escape(month.abb)
print(month_input)
# <SQL> ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
query <- sqlInterpolate(con, "SELECT * FROM colours WHERE month IN ?months",
months = month_input)
print(query)
# <SQL> SELECT * FROM colours WHERE month IN ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')