我想知道是否有任何方法可以通过params of dbGetQuery()将任意数量的参数传递给IN子句
例如,给定以下任一项
dbcon <- dbConnect(RPostgres::Postgres())
# or: dbcon <- dbConnect(RPostgreSQL::PostgreSQL())
dbExecute(dbcon, "CREATE TEMP TABLE foo AS SELECT i FROM generate_series(1, 10) x(i);")我可以这样做吗:
dbGetQuery(dbcon, "SELECT * FROM foo WHERE i IN (1, 2, 3)")其中标识符是“短值列表”,即通常少于10个整数或字符串。我想我也许可以这样做:
ids <- c(1, 2, 3)
dbGetQuery(dbcon, "SELECT * FROM foo WHERE i IN $1", list(ids))但我能做的最多就是:
ids <- '{1,2,3}'
dbGetQuery(dbcon, "SELECT * FROM foo WHERE i = ANY($1)", list(ids))但是,从一组字符串生成ids在某种程度上很容易出错。
发布于 2018-12-05 00:11:24
您希望使用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')https://stackoverflow.com/questions/53616519
复制相似问题