带有动态字符串的 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 语句使用 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)
这也适用于参数化查询:
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).
DBI 和 RSQLite 的最新版本将 return 一个包含这些查询结果的数据框。
请注意,通常不鼓励在 SQL 查询中使用变量,因为它会使您容易受到注入攻击。 https://db.rstudio.com/best-practices/run-queries-safely/
从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 语句使用 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)
这也适用于参数化查询:
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).
DBI 和 RSQLite 的最新版本将 return 一个包含这些查询结果的数据框。
请注意,通常不鼓励在 SQL 查询中使用变量,因为它会使您容易受到注入攻击。 https://db.rstudio.com/best-practices/run-queries-safely/