R dbGetQuery с динамической строкой - PullRequest
0 голосов
/ 08 июня 2018

С Этот пост и Этот пост , я получил способ написать динамическую команду 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.

Мне интересно, есть ли у кого-нибудь идеи о том, почему это происходит?Любая помощь будет оценена!

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Поскольку я считаю, что драйверы R DBI еще не реализовали поддержку нескольких операторов SQL, dbGetQuery возвращает только первое утверждение.

Следовательно, вам нужно итеративно запустить sqlcmd для нескольких операторов SQL, например, с 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)

В качестве альтернативы используйте UNION или UNION ALL для одного оператора SQL.

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)
0 голосов
/ 09 июня 2018

Это также работает с параметризованными запросами:

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))

Создано в 2018-06-11 пакетом prex (v0.2.0).

Последние версии DBI и RSQLite будут возвращать фрейм данных, содержащий объединенные результаты этих запросов.

0 голосов
/ 08 июня 2018

Обычно я делаю это следующим образом:

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)

Однако, если вы хотите вернуть список фреймов данных для каждого идентификатора и выполнить запрос три раза, вы могли бы сделать:

sqlcmd <- paste("select col1, col2 from DB where ItemId in (", Id1, ")", sep="")    
dataList <- lapply(sqlcmd, function(x) dbGetQuery(conn, x)) 
...