[英]R dbGetQuery with dynamic string
從這篇文章和這篇文章,我得到了一種編寫 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
列表中的第一個元素。
我想知道是否有人對為什么會發生這種情況有任何想法? 任何幫助,將不勝感激!
我通常會這樣做:
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))
由於我相信 R DBI 驅動程序還沒有實現多 SQL 語句支持, dbGetQuery
只返回第一條語句。
因此,您需要為多個 SQL 語句迭代運行sqlcmd ,例如使用lapply
返回數據幀列表,然后是對單個主數據幀的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))
最新版本的DBI和RSQLite將返回一個數據框,其中包含這些查詢串聯的結果。
請注意,通常不鼓勵在 SQL 查詢中使用變量,因為它會使您容易受到注入攻擊。 https://db.rstudio.com/best-practices/run-queries-safely/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.