library(DBI)
library(RSQLite)
library(dplyr)
con <- dbConnect(RSQLite::SQLite(), ":memory:")
iris_id <- iris |>
mutate(id = row_number())
dbWriteTable(con, "iris_id", iris_id)
params <- list(id = c(5,6,7))
q <- "SELECT COUNT(*) FROM iris_id WHERE id IN ($id)"
res <- dbSendQuery(con, q)
dbBind(res, params)
dbFetch(res)
根据文档,它对params$id
中的每个条目执行一次查询,并返回c(1,1,1)
。
这也不起作用,因为这个查询实际上是WHERE id IN ('5,6,7')
:
id <- c(5L,6L,7L)
stopifnot(is.integer(id))
params <- list(id = paste(id, collapse=","))
res <- dbSendQuery(con, q)
dbBind(res, params)
dbFetch(res)
问题[0]的答案建议使用位置?
和粘贴一个?
的列表在一起,但是这失去了使用命名参数的可能性,如果我有多个参数,这将是有益的,有其他方法吗?
[0][Passing DataFrame column into WHERE clause in SQL query embedded in R via parametrized queries](https://stackoverflow.com/questions/70588433/passing-dataframe-column-into-where-clause-in-sql-query-embedded-in-r-via-parame)
2条答案
按热度按时间j0pj023g1#
一种解决方案是将所有id作为逗号分隔的字符串(没有空格)传递,并使用
LIKE
操作符代替IN
:mfuanj7w2#