使用R's 'DBI'直接在数据库中获取'rbind' ed * 和 * 的参数化查询的结果集

osh3o9ms  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(145)

使用R的DBI,我需要:
1.运行具有不同参数(即,参数向量)的参数化查询;
1.获得连接的结果集(即按照R术语rbind ed或按照SQL术语union ed);
1.并在数据库中获取结果表以供进一步操作。
dbBind/dbGetquery满足要求1和2,但是我需要使用dbWriteTable将结果 Dataframe 写入数据库,这是低效的:

library(DBI)
con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(con, "iris", iris)

res <- dbGetQuery(con,
                  "select * from iris where Species = ?",
                  params = list(c("setosa", "versicolor")))

dbWriteTable(con, "mytable", res)

相反,dbExecute满足了需求3,但我不认为它具有"rbind特性"。当然,这会抛出一个错误,因为表会被覆盖:

dbExecute(con,
          "create table mytable as select * from iris where Species = ?",
          params = list(c("setosa", "versicolor")))

最有效/推荐的方法是什么?
注:

  • 我不是DBA,只能通过R访问数据库。
  • 我的例子太琐碎了,可以在单个查询中实现。我的用例实际上需要使用不同的参数多次运行参数化查询。
  • 我必须使用Oracle,但我对解决方案感兴趣,即使它不适用于Oracle。
toe95027

toe950271#

**1)**使用第一个参数创建表,然后将其他参数插入其中。

library(RSQLite)

con <- dbConnect(SQLite())
dbWriteTable(con, "iris", iris)

parms <- c("setosa", "versicolor")

dbExecute(con, "create table mytable as
  select * from iris where Species = ?",
  params = parms[1])
for (p in parms[-1]) {
  dbExecute(con, "insert into mytable
    select * from iris where Species = ?",
    params = p)
}

# check
res <- dbGetQuery(con, "select * from mytable")
str(res)

**2)**或者生成SQL语句的文本来完成所有工作。sqldf拉入RSQLite和gsubfn,后者提供fn$来启用文本替换。

library(sqldf)

con <- dbConnect(SQLite())
dbWriteTable(con, "iris", iris)

parms <- c("setosa", "versicolor")
parmString <- toString(sprintf("'%s'", parms))
fn$dbExecute(con, "create table mytable as
  select * from iris where Species in ($parmString)")

# check
res <- dbGetQuery(con, "select * from mytable")
str(res)

相关问题