R中的动态SQL查询(WHERE)

时间:2014-04-02 20:29:14

标签: sql r postgresql dynamic-sql

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

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

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

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

3 个答案:

答案 0 :(得分:2)

问题问题可能是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'")

答案 1 :(得分:2)

您应该使用产生错误结果的paste0代替paste,或使用效率稍低的paste(..., collapse='')(请参阅?paste0docs here)。< / p>

另外,您应该考虑在单独的变量中准备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是否真的符合我的预期。

答案 2 :(得分:1)

试试这个:

    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'"