是否存在连接查询字符串的“更清洁”方式?

问题描述 投票:1回答:2

我正在将查询字符串传递给连接,结果应如下所示:

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客户端引发了错误。雅典娜错误编号:372,HTTP响应代码:1,错误消息:SYNTAX_ERROR:第3:15行:“ =”无法应用于varchar,整数

是否有“正确”的方法?如何构造带有变量的查询字符串,然后将其传递给DBI::dbGetQuery()

r dbi rodbc dbplyr
2个回答
2
投票

[这里有两个选项,我们可以将输入作为字符串引用为'monthyear函数返回数字值

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)
    }

2
投票

我们可以使用gsubfn中的fn$执行字符串插值。为了重现性,我们将使用NULL代替实际的连接,并使用fn$list代替fn$dbGetQuery,但是您可以同时替换两者。执行此操作时,请勿在名称中使用下划线或点。

© www.soinside.com 2019 - 2024. All rights reserved.