R dbGetQuery与动态字符串

时间:2018-06-08 19:12:41

标签: sql r sqlite rsqlite

This postThis 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列表中的第一个元素。

我想知道是否有人对此为何会有任何想法?任何帮助将不胜感激!

4 个答案:

答案 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语句使用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)

答案 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/