【问题标题】:R - SQL query only takes 1000 ArgumentsR - SQL查询只需要1000个参数
【发布时间】:2022-11-18 14:55:52
【问题描述】:

我想在我的脚本中用 SQL 执行数据库查询。但是,查询太大了,因为 SQL 只需要 1000 个参数。现在我已经修改了模运算符,但想知道是否有更优雅的方法在数据量增加时也能起作用。

提前致谢

modulo <- length(ticker_selected) + (1000 - length(ticker_selected) %% 1000)
temp <- list()
for(x in 1:(modulo/1000)) {try(
  temp[x] <- toString(sprintf("'%s'",(ticker_selected)[(length(ticker_selected)-(x-1)*999):(length(ticker_selected) - (x*999))]))
  , silent = TRUE)}
temp[x] <- toString(sprintf("'%s'",(ticker_selected)[1:((length(ticker_selected)%%999))]))

【问题讨论】:

  • 假设您正在尝试生成一个可供选择的代码不超过 1000 个的查询字符串是否安全?你可以插入一个包含 1000 个或更多代码的临时表,然后从您的真实表中对其进行内部连接。

标签: r


【解决方案1】:

您是否在寻找类似以下代码的内容?

  1. 要在 ticker_selected 的块中创建字符串,请定义块大小;
  2. 通过ticker_selected的次数是其长度除以该大小的整数商;
  3. 最后还有剩余/模数可供阅读。

    首先遍历每一遍然后剩下什么。我发现代码更具可读性。
    而且,不算 0 和 1,唯一的硬编码常量就在它的开头。

    chunk_size <- 1000L
    passes <- length(ticker_selected) %/% chunk_size
    remaining <- length(ticker_selected) %% chunk_size
    temp <- vector("list", length = passes + (remaining != 0))
    start <- 1L
    
    for(i in seq_len(passes)) {
      current <- ticker_selected[start:(start + chunk_size - 1L)]
      current <- toString(sprintf("'%s'", current))
      start <- start + chunk_size
      temp[i] <- current
    }
    if(remaining != 0) {
      current <- ticker_selected[start:length(ticker_selected)]
      current <- toString(sprintf("'%s'", current))
      temp[length(temp)] <- current
    }
    

    编辑

    回答用户Abecomment ,我相信以下解决了问题。

    1. dataframe$variable代替tickers_selected
    2. lapply 循环中运行查询,返回结果列表;
    3. rbind结果。
      query_results_list <- lapply(temp, (x) {
        s <- sprintf("SELECT var1, var2 FROM database WHERE identifier IN ( %s ) ", x)
        DBI::dbGetQuery(conn, s)
      })
      
      # fast
      result <- data.table::rbindlist(query_results_list)
      
      # slow but base R
      result <- do.call(rbind, query_results_list)
      

【讨论】:

  • 你好呀!我遇到了这个解决方案,希望它能为我解决问题。我正在尝试将我环境中数据框中的列传递给 SQL 查询的 WHERE 子句,并且由于列中的元素数量而达到最大查询文本长度。这是该问题的适当解决方案吗?如果是这样,我不清楚这里的答案是 SQL 查询(例如 DBI::dbGetQuery(conn, sprintf("SELECT var1, var2 FROM database WHERE identifier IN ( %s ) ",paste(dataframe$variable, collapse = ','))))的去向。你能提供一些指导吗?
  • @Abe 看看编辑是否解决了问题。
猜你喜欢
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 2017-04-19
  • 2016-03-29
  • 2021-12-10
  • 2021-09-11
  • 1970-01-01
相关资源
最近更新 更多