首页 > 解决方案 > 带有原生 R 对象的 SQL 语句

问题描述

我正在使用从 R 查询的 Oracle SQL 数据库。是否可以在语句中使用本机 R 对象查询 Oracle DB,例如将 DB 表连接到数据框?

设置where条件在 R 中很好地工作,如下所示:

oraConnect::load_from_db(sprintf('select * from dual where DUMMY = %s', 'X'))

例如,是否有可能通过将 R 对象插入到 oracle SQL 语句中来将 DB 数据表连接到 R 数据表(不能像所写的那样工作)?:

testdf = data.frame(DUMMY = 'X')
oraConnect::load_from_db(sprintf('select DUMMY from dual join %s rdf on dual.DUMMY = rdf.DUMMY', testdf))

标签: roracle

解决方案


此答案不使用该oraConnect软件包,但只要您在计算机上设置了 odbc 连接,就可以用于连接到 Oracle 数据库。

连接

首先加载包并连接到数据库

library(odbc)
library(DBI)
con <- dbConnect(odbc(), 'YOUR_DSN')

设置好连接后,您可以进行快速测试查询。我使用 SendQuery、Fetch 和 Clear。您不必这样做,但它避免了一些冲突等,并使处理更大的数据拉取更容易。请注意,如果需要,“schema_name”是数据库中的模式名称。

query <- DBI::dbSendQuery(con, "SELECT * FROM schema_name.table WHERE ROWNUM <= 10")
out <- DBI::dbFetch(query)
DBI::dbClearResult(query)

out对象将包含您的数据。

自动生成查询

现在这是我将使用该glue包的地方

library(glue)

dat  <- c("apples", "pears", "oranges")

(my_new_query <- glue("SELECT * FROM schema_name.table_name WHERE id = {dat}"))

# SELECT * FROM schema_name.table_name WHERE id = apples
# SELECT * FROM schema_name.table_name WHERE id = pears
# SELECT * FROM schema_name.table_name WHERE id = oranges

或者类似的东西

table_1 <- "cities"
table_2 <- "states"

(my_new_query <- glue("SELECT a.* FROM schema_name.{table_1} LEFT JOIN schema_name.{table_2} ON..."))

#SELECT a.* FROM schema_name.cities LEFT JOIN schema_name.states ON...

然后您可以将其提交到您的数据库

query <- DBI::dbSendQuery(con, my_new_query)
out <- DBI::dbFetch(query)
DBI::dbClearResult(query)

您还可以在glue语句中添加内容,例如制作列表。


dat  <- c("apples", "pears", "oranges")

(my_new_query <- glue("SELECT * FROM schema_name.table_name WHERE id = IN({glue_collapse(dat, sep = ',')})"))

#SELECT * FROM schema_name.table_name WHERE id = IN(apples,pears,oranges)

因此一切都可以扩展。


推荐阅读