从This post和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
时,它只会返回ItemId = 34
的数据,这是Id
列表中的第一个元素。
我想知道是否有人对此为何会有任何想法?任何帮助将不胜感激!
答案 0 :(得分:1)
我通常会这样做:
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)
但是,如果您想为每个ID返回一个数据框列表并运行查询三次,您可以这样做:
sqlcmd <- paste("select col1, col2 from DB where ItemId in (", Id1, ")", sep="")
dataList <- lapply(sqlcmd, function(x) dbGetQuery(conn, x))
答案 1 :(得分:1)
由于我认为R DBI驱动程序尚未实现多个SQL语句支持,dbGetQuery
仅返回第一个语句。
因此,您需要为多个SQL语句(例如lapply
)迭代运行 sqlcmd 以返回数据帧列表,然后对单个主节点调用rbind
dataframe:
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语句使用UNION
或UNION 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)
答案 2 :(得分:1)
这也适用于参数化查询:
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))
由reprex package(v0.2.0)创建于2018-06-11。
DBI 和 RSQLite 的最新版本将返回一个数据框,其中包含这些查询连接的结果。
答案 3 :(得分:0)
请注意,通常不建议在SQL查询中使用变量,因为它会使您容易受到注入攻击。 https://db.rstudio.com/best-practices/run-queries-safely/