带有动态字符串的 R dbGetQuery

R dbGetQuery with dynamic string

This post and This post,我得到了一个写rsqlite动态命令的方法。但是,它对我不起作用。我的数据如下:

Id <- c(34, 22, 86)
sqlcmd <- paste("select col1, col2 from DB where ItemId =", Id, sep="")
Df <- dbGetQuery(conn, sqlcmd)

我的 sqlcmd 给了我一个字符串列表

"select col1, col2 from DB where STOREID =34"
"select col1, col2 from DB where STOREID =22"
"select col1, col2 from DB where STOREID =86"

但是,当我将 sqlcmd 传递给 dbGetQuery 时,它只有 returns 带有 ItemId = 34 的数据,这是 Id 列表中的第一个元素.

我想知道是否有人对为什么会发生这种情况有任何想法?如有任何帮助,我们将不胜感激!

我通常会这样做:

Id1 <- c(34, 22, 86)

Id2 <- paste(Id1, collapse = ", ")
sqlcmd <- paste("select col1, col2 from DB where ItemId in (", Id2, ")", sep="")
Df <- dbGetQuery(conn, sqlcmd)

但是,如果你想 return 每个 id 的数据帧列表和 运行 查询三次,你可以这样做:

sqlcmd <- paste("select col1, col2 from DB where ItemId in (", Id1, ")", sep="")    
dataList <- lapply(sqlcmd, function(x) dbGetQuery(conn, x)) 

由于我相信 R DBI 驱动程序尚未实现多个 SQL 语句支持,因此 dbGetQuery 仅 return 第一个语句。

因此,您需要迭代 运行 您的 sqlcmd 用于多个 SQL 语句,例如 with lapply 到 return数据帧列表,然后是 rbind 调用单个主数据帧:

Id <- c(34, 22, 86)
sqlcmd <- paste("select col1, col2 from DB where ItemId =", Id, sep="")

# LIST OF DATAFRAMES
df_list <- lapply(sqlcmd , function(x) dbGetQuery(conn, x)) 

# FINAL DATAFRAME
final_df <- do.call(rbind, df_list)

或者,对一个 SQL 语句使用 UNIONUNION ALL

Id <- c(34, 22, 86)
sqlcmd <- paste("select col1, col2 from DB where ItemId =", Id, sep="")

single_sql <- paste(sqlcmd, collapse = " UNION ")
final_df <- dbGetQuery(conn, single_sql)

或者还是用OR:

single_sql <- paste("select col1, col2 from DB where ItemId =", 
                    paste(Id, collapse=" OR ItemId = "))

final_df <- dbGetQuery(conn, single_sql)

这也适用于参数化查询:

library(RSQLite)
conn <- dbConnect(SQLite())
dbWriteTable(conn, "DB", data.frame(col1 = 1, col2 = 2, ItemId = 3))

Id <- c(34, 22, 86)
sqlcmd <- "select col1, col2 from DB where ItemId = ?"
Df <- dbGetQuery(conn, sqlcmd, params = list(Id))

Created on 2018-06-11 by the reprex package (v0.2.0).

DBIRSQLite 的最新版本将 return 一个包含这些查询结果的数据框。

请注意,通常不鼓励在 SQL 查询中使用变量,因为它会使您容易受到注入攻击。 https://db.rstudio.com/best-practices/run-queries-safely/