【问题标题】:R programming: RODBC and dataframeR 编程:RODBC 和数据框
【发布时间】: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"

【问题讨论】:

    标签: r rodbc rjdbc


    【解决方案1】:

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

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

    交替使用paste 或sprintf 来构造字符串:

    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 正是我们所需要的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-08
        • 2015-06-26
        • 2021-05-22
        • 1970-01-01
        • 1970-01-01
        • 2013-06-21
        • 2014-07-09
        相关资源
        最近更新 更多