【问题标题】:How to use EXTRACT through dbplyr when connecting to an Oracle DB连接到 Oracle 数据库时如何通过 dbplyr 使用 EXTRACT
【发布时间】:2017-11-22 15:36:52
【问题描述】:

接受这个查询:

SELECT EXTRACT(month FROM order_date) "Month"
  FROM orders

(来自official oracle doc的简化示例)

您将如何将上述EXTRACT 操作集成到dbplyr 链中?

我愿意接受任何其他解决方法(甚至丑陋/昂贵)来在服务器端提取月份。

【问题讨论】:

  • mutate(Month = sql('extract(month from order_date)') 为我工作。

标签: r oracle dbplyr


【解决方案1】:

更优雅:

tbl(con, "orders") %>% mutate(Month = extract(NULL %month from% order_date))

这会产生以下 SQL (ANSI SQL):

EXTRACT( MONTH FROM "order_date")

这个技巧之所以有效,是因为运算符的名称(百分号之间的内容)是按字面意思翻译成 SQL 的。 NULL 消失(与 NA 不同)。

【讨论】:

  • 这将非常有用,谢谢。该功能没有非常明确地记录,但可以在?dbplyr::translate_sql的示例中看到
【解决方案2】:

与此同时,我想出了一些东西。

给定示例的预期输出将通过执行以下操作获得:

con <- ROracle::dbConnect(drv, username, password, dbname) # your connection parameters
dplyr::tbl(con,"orders") %>%
  extract_o("Month","order_date",append = FALSE,force_upper_case = FALSE)

这是函数的代码,我包含了一些参数来强制大写列(默认)并将新列附加到现有列(默认)。可以定义新列的名称,或者默认将其命名为您要提取的值的类型。

#' use Oracle EXTRACT function
#' 
#' Will add a column to the table, containing extracted value,
#' optionally returns only this column
#' @param data tbl_lazy object
#' @param what type of data to extract
#' @param from column to extract from
#' @param new_col name of new column
#' @param append keep existing columns,
#' FALSE ditches them and keep only extracted column
#' @param force_upper_case make new column name uppercase
extract_o <-function(data, what, from, new_col = what,
                     append = TRUE,force_upper_case = TRUE) {
  allowed <- c("day","month","year","hour","minute","second",
                     "timezone_hour","timezone_minute",
                     "timezone_region","timezone_abbr")
  assertthat::assert_that(
    tolower(what) %in% allowed,
    msg=paste("Choose 'what' among",
              paste0("'",allowed,"'",collapse=", ")))
  if(force_upper_case) new_col <- toupper(new_col)
  tbl_query <- as.character(dbplyr::sql_render(data)) # previous query
  append_sql <- if(append)
    paste0(paste(colnames(data),collapse=", "),", ") else ""
  query <- paste0("SELECT ", append_sql,                         # initial cols or none
                  "EXTRACT(",what," FROM ",from,") \"",new_col,  # new col
                  "\" FROM (",tbl_query,")")                     # previous query
  dplyr::tbl(data$src$con,sql(query))
}

【讨论】:

    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2018-06-20
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    相关资源
    最近更新 更多