首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将RPostgres或RPostgreSQL dbGetQuery()参数传递给IN运算符

将RPostgres或RPostgreSQL dbGetQuery()参数传递给IN运算符
EN

Stack Overflow用户
提问于 2018-12-04 23:40:34
回答 1查看 426关注 0票数 1

我想知道是否有任何方法可以通过params of dbGetQuery()将任意数量的参数传递给IN子句

例如,给定以下任一项

代码语言:javascript
复制
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);")

我可以这样做吗:

代码语言:javascript
复制
dbGetQuery(dbcon, "SELECT * FROM foo WHERE i IN (1, 2, 3)")

其中标识符是“短值列表”,即通常少于10个整数或字符串。我想我也许可以这样做:

代码语言:javascript
复制
ids <- c(1, 2, 3)
dbGetQuery(dbcon, "SELECT * FROM foo WHERE i IN $1", list(ids))

但我能做的最多就是:

代码语言:javascript
复制
ids <- '{1,2,3}'
dbGetQuery(dbcon, "SELECT * FROM foo WHERE i = ANY($1)", list(ids))

但是,从一组字符串生成ids在某种程度上很容易出错。

EN

回答 1

Stack Overflow用户

发布于 2018-12-05 00:11:24

您希望使用DBI::sqlInterpolate生成动态查询。这比不安全地将查询粘贴在一起要好。然而,对于矢量输入来说,dbplyr::translate_sql并不能很好地工作,因此,如果您能够忍受更多的包导入,那么它就足够好了。示例:

代码语言:javascript
复制
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')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53616519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档