【发布时间】:2020-01-25 00:21:10
【问题描述】:
我正在将查询字符串传递给连接,结果应如下所示:
select game_name, month, count(*) as count
from device_metrics.mtu_events
where YEAR = '2019' and month between '07' and '09'
group by game_name, month
order by game_name asc, month asc
如果我将上面的块作为单个字符串传递给DBI::dbGetQuery(con, myquery),这很好用
但是日期是闪亮应用程序中的一个变量,所以我尝试创建一个函数来生成查询字符串:
my_query <- function(start_date, end_date) {
yr <- year(ymd(start_date))
month_start <- month(ymd(start_date))
month_end <- month(ymd(end_date))
query <- paste0(
"select game_name, month, count(*) as count
from device_metrics.mtu_events
where YEAR = ", yr, " and month between ", month_start, " and ", month_end,
" group by game_name, month
order by game_name asc, month asc")
return(query)
}
当我调用这个函数并尝试用它查询我们的数据库时,我得到:
AWS Athena 客户端引发错误。 Athena 错误编号:372,HTTP 响应代码:1,错误消息:SYNTAX_ERROR: line 3:15: '=' cannot be applied to varchar, integer
有没有“正确”的方法来做到这一点?如何构造带有变量的查询字符串,然后传递给DBI::dbGetQuery()
【问题讨论】:
-
我猜你需要
where YEAR = '", yr, "' and month between '", month_start, "' and '", month_end, "' group_by grame_name, month,因为'yr'、'month_start'、'month_end'周围的单引号不在paste0中 -
那会是等价的吗?这进一步
month_start <- month(ymd(start_date)) %>% str() -
我猜
month(Sys.Date())返回数字试试my_query <- function(start_date, end_date) { yr <- year(ymd(start_date)) month_start <- month(ymd(start_date)) month_end <- month(ymd(end_date)) query <- paste0( "select game_name, month, count(*) as count from device_metrics.mtu_events where YEAR = '", yr, "' and month between '", month_start, "' and '", month_end, "' group by game_name, month order by game_name asc, month asc") return(query) } -
坦率地说,我更愿意将
DBI::dbBind与参数化查询一起使用,而不是进行引用等(bobby-tables.com)。 (我对雅典娜的方言不熟悉,不知道它的支持情况如何。)