sqlite 在R中安全地参数化SQL查询的WHERE ... IN列表

uwopmtnx  于 2023-01-26  发布在  SQLite
关注(0)|答案(2)|浏览(216)
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)

j0pj023g

j0pj023g1#

一种解决方案是将所有id作为逗号分隔的字符串(没有空格)传递,并使用LIKE操作符代替IN

params <- list(id = "5,6,7")
q <- "SELECT COUNT(*) FROM iris_id WHERE ',' || $id || ',' LIKE '%,' || id || ',%'"
res <- dbSendQuery(con, q) 
dbBind(res, params)
dbFetch(res)
mfuanj7w

mfuanj7w2#

library(dbplyr)
translate_sql(id %in% c(4L,5L,6L))

相关问题