从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
是列表中的第一个元素。我想知道是否有人对此有何想法?任何帮助,将不胜感激!
最佳答案
由于我认为R DBI驱动程序尚未实现多个SQL语句支持,因此dbGetQuery
仅返回第一条语句。
因此,您需要针对多个SQL语句(例如,使用lapply
迭代地运行sqlcmd)以返回数据帧列表,然后对单个主数据帧进行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语句使用
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)
关于sql - 带动态字符串的R dbGetQuery,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50767089/