我正在尝试使用R和postgres包连接到我的数据库的一些动态SQL查询。
不幸的是,如果我执行以下语句,我会得到一个空数据框:
x <- "Mean"
query1 <- dbGetQuery(con, statement = paste(
"SELECT *",
"FROM name",
"WHERE statistic = '",x,"'"))
我相信最后一行某处存在语法错误。我已经以各种可能的方式更改了逗号和引号,但似乎没有任何效果。 有没有人知道我如何用动态WHERE语句使用R变量构建这个SQL查询?
答案 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='')
(请参阅?paste0
或docs 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'"