【问题标题】:Writing Lengthy SQL queries in R在 R 中编写冗长的 SQL 查询
【发布时间】:2015-06-12 09:57:51
【问题描述】:

我正在研究如何将数据从服务器直接读入 R 中的数据框。过去,我编写过超过 50 行的 SQL 查询(包含所有选择和连接)。关于如何在 R 中编写长查询的任何建议?有没有办法在 R 中的其他地方编写查询,然后将其粘贴到代码的“sqlQuery”部分?

【问题讨论】:

标签: mysql sql sql-server r rodbc


【解决方案1】:

将长 SQL 查询保存在 .sql 文件中,并使用 readLines + paste with collapse='\n' 读取它们

my_query <- paste(readLines('your_query.sql'), collapse='\n')
results <- sqlQuery(con, my_query)

【讨论】:

    【解决方案2】:

    您可以将任何 SQL 查询按原样粘贴到 R 中,然后简单地将换行符 + 空格替换为单个空格。例如:

    ## Connect ot DB
    library(RODBC)
    con <- odbcConnect('MY_DB')
    
    ## Paste the query as is (you can have how many spaces and lines you want)
    query <- 
    "
      SELECT [Serial Number]
            ,[Series]
            ,[Customer Name]
            ,[Zip_Code]
    
      FROM [dbo].[some_db]
    
      where [Is current] = 'Yes' and 
            [Serial Number] LIKE '5%' and
            [Series] = '20'
    
      order by [Serial Number]
    
    "
    
    ## Simply replace the new lines + spaces with a space and you good to go
    res <- sqlQuery(con, gsub("\\n\\s+", " ", query))
    close(con)
    

    【讨论】:

      【解决方案3】:

      如果喜欢在一个文件中编辑代码,使用单独的 .sql(大多数 sql 或 nosql 引擎)文件的方法可能会很麻烦。
      至于使用 RStudio(或其他可以自定义代码折叠的工具)的人,可以使用括号进行简化。我更喜欢使用{...} 并折叠代码。

      例如:

      query <- {'
       SELECT 
        user_id,
        format(date,"%Y-%m") month,
        product_group,
        product,
        sum(amount_net) income,
        count(*) number
      FROM People 
      WHERE 
        date > "2015-01-01" and
        country = "Canada"
        GROUP BY 1,2,3;'})
      

      折叠查询甚至可以在函数内完成(折叠长参数),或者在我们的代码扩展到不方便大小的其他情况下。

      【讨论】:

        【解决方案4】:

        我在尝试通过 RODBC 运行 17 行 SQL 查询时遇到了这个问题,并尝试了 @arvi1000 的解决方案,但无论我做什么,它都会产生错误消息并且不会执行超过一行的 .sql 文件.尝试了 collapse 的值的变体以及读取文件的不同方式。花了 90 分钟试图让它工作。怀疑 RODBC 在不同平台上的多行查询或不同版本的 MySQL 或 ODBC 设置的行为可能不同。

        无论如何,以下循环安排可能没有那么优雅,但它可以工作并且可能更健壮:

        channel <- odbcConnect("mysql_odbc", uid="username", pwd="password")
        sqlString<-readLines("your_query.sql")           
        
        for (i in 1:length(sqlString)) {
          print(noquote(sqlString[i]))
          sqlQuery(channel, as.name(sqlString[i]))
        }
        

        在我的脚本中,除了最后一行之外,所有的行都在进行连接、创建临时表等,只有最后一行有一个 SELECT 语句并产生了一个输出。 .sql 文件很整洁,每行只有一个查询,查询中没有 cmets 或换行符。看起来这个循环运行了所有代码,但是输出可能在某个范围内丢失了,因此需要在循环外重复一个 SELECT 语句。

        【讨论】:

          猜你喜欢
          • 2012-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多