R 编程:RODBC 和数据框

R programming: RODBC and dataframe

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

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

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

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

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)
dataframe <- sqlQuery(connection, paste("
+ SELECT
+ dimension1,
+ FROM
+ table1,
+ WHERE
+ dimension1 =",  df$number))

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