R 编程:RODBC 和数据框

Posted

技术标签:

【中文标题】R 编程:RODBC 和数据框【英文标题】:R programming: RODBC and dataframe 【发布时间】:2015-02-13 20:45:39 【问题描述】:

无法理解如何将数据框的列值传递给查询?如果我直接传递值,查询就可以正常工作。

这些值存储在 df$number 中。为了共享目的更改了表名:

dataframe <- sqlQuery(connection, "
+ SELECT
+ dimension1,
+ FROM
+ table1,
+ WHERE
+ dimension1 = df$number ")

我收到错误 [1] "42S22 904 [Oracle][ODBC][Ora]ORA-00904: \"df$number\": invalid identifier\n"

【问题讨论】:

【参考方案1】:

gsubfn package 可以执行准 perl 风格的字符串插值。在任何函数前面加上 fn$ 以针对该函数的参数打开它:

library(gsubfn)

num <- 3
dataframe <- fn$sqlQuery(connection, 
         "SELECT dimension1 FROM table1 WHERE dimension1 = $num ")

交替使用pastesprintf 来构造字符串:

sql <- paste("SELECT dimension1 FROM table1 WHERE dimension1 =", num)
sqlQuery(connection, sql)

sql <- sprintf("SELECT dimension1 FROM table1 WHERE dimension1 = %d", num)
sqlQuery(connection, sql)

【讨论】:

【参考方案2】:
dataframe <- sqlQuery(connection, paste("
+ SELECT
+ dimension1,
+ FROM
+ table1,
+ WHERE
+ dimension1 =",  df$number))

【讨论】:

【参考方案3】:

SQL 语句是一个字符串,因此它无法访问您的数据框的值。要构造一个使用该值的字符串,请使用:

sql.base<-"SELECT dimension1 FROM table1 WHERE dimension1 = "
sql.completed<-paste0(sql.base,df$number)
sqlQuery(connection, sql.completed)

如果您要执行参数化 SQL 查询,即 df 中有许多行,您可以使用逗号分隔符折叠字段值并将它们放在 SQL IN 查询中的侧括号中.或者,您可以使用 RODBCext 包,这将允许这样做

sqlExecute(connection, "SELECT dimension1 FROM table1 WHERE dimension1 = ?", df$number, fetch = TRUE) 

有关 RODBCext 和此类 SQL 的更多信息,请查看their vignette

【讨论】:

参数化正是我们所需要的! RODBCext 正是我们所需要的。

以上是关于R 编程:RODBC 和数据框的主要内容,如果未能解决你的问题,请参考以下文章

来自 RODBC 的 sqlSave 仅在 R 中保存日期的年份

如何在 R 中使用 RODBC 在 MS Access 中执行查询?

RODBC 游标查询

RODBC :: sqlSave()创建表,警告:在列中截断为255个字节?

RODBC 不会从数据框中保存超过 8k 的 varchar/text

R语言RODBC数据库操作