簡體   English   中英

帶有動態字符串的 R dbGetQuery

[英]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 語句使用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)

這也適用於參數化查詢:

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 包(v0.2.0) 於2018年 6 月 11 日創建。

最新版本的DBIRSQLite將返回一個數據框,其中包含這些查詢串聯的結果。

請注意,通常不鼓勵在 SQL 查詢中使用變量,因為它會使您容易受到注入攻擊。 https://db.rstudio.com/best-practices/run-queries-safely/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM