【问题标题】:Dynamic SQL Query in R (WHERE)R中的动态SQL查询(WHERE)
【发布时间】:2014-05-14 09:05:27
【问题描述】:

我正在尝试使用 R 和 postgres 包连接到我的数据库的一些动态 SQL 查询。

不幸的是,如果我执行以下语句,我会得到一个空数据框:

    x <- "Mean"
query1 <- dbGetQuery(con, statement = paste(
  "SELECT *",
  "FROM name",
  "WHERE statistic = '",x,"'"))

我相信最后一行的某处存在语法错误。我已经以各种可能的方式更改了逗号和引号,但似乎没有任何效果。 有谁知道我如何使用 使用 R 变量的动态 WHERE 语句构造这个 SQL 查询?

【问题讨论】:

    标签: sql r postgresql dynamic-sql


    【解决方案1】:

    问题问题可能是Mean周围有空格:

    x <- "Mean"
    s <- paste(
      "SELECT *",
      "FROM name",
      "WHERE statistic = '",x,"'")
    

    给予:

    > s
    [1] "SELECT * FROM name WHERE statistic = ' Mean '"
    

    更正版本改为尝试:

    s <- sprintf("select * from name where statistic = '%s'", x)
    

    给予:

    > s
    [1] "select * from name where statistic = 'Mean'"
    

    gsubfn你也可以试试这个:

    library(gsubfn)
    fn$dbGetQuery(con, "SELECT * 
                        FROM name 
                        WHERE statistic = '$x'")
    

    【讨论】:

    • 啊!我没想到!你知道如何删除空格吗?
    【解决方案2】:

    试试这个:

        require(stringi)
        stri_paste("SELECT * ",
          "FROM name ",
          "WHERE statistic = '",x,"'",collapse="")
        ## [1] "SELECT * FROM name WHERE statistic = 'Mean'"
    

    或使用连接运算符%+%

    "SELECT * FROM name WHERE statistic ='" %+% x %+% "'"
    ## [1] "SELECT * FROM name WHERE statistic ='mean'"
    

    【讨论】:

    • 带有“stringi”包的解决方案对我有用!谢谢!
    【解决方案3】:

    您应该使用paste0 而不是产生错误结果的paste 或效率稍低的paste(..., collapse='')(请参阅?paste0docs here)。

    您还应该考虑在分隔变量中准备 SQL 语句。通过这种方式,您始终可以轻松检查正在生成的 SQL。

    我会用这个(而且我一直在用这个):

      x   <- "Mean"
      sql <- paste0("select * from name where statistic='", x, "'")
      # print(sql)
      query1 <- dbGetQuery(con, sql)
    

    如果我在函数中有 SQL,我总是添加 debug 参数,这样我就可以看到使用了什么 SQL:

    function get_statistic(x=NA, debug=FALSE) {
    
      sql <- paste0("select * from name where statistic='", x, "'")
    
      if(debug) print(sql)
    
      query1 <- dbGetQuery(con, sql)
    
      query1
    }
    

    然后我可以简单地使用get_statistic('Mean', debug=TRUE),我会立即看到生成的 SQL 是否真的符合我的预期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 2014-08-04
      • 2012-06-21
      • 1970-01-01
      相关资源
      最近更新 更多