在 R 中编写冗长的 SQL 查询

Writing Lengthy SQL queries in R

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

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

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

我在尝试通过 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 文件很整洁,每行只有一个查询,查询中没有注释或换行符。看起来这个循环 运行 包含了所有代码,但是输出可能在某个范围内丢失了,所以需要在循环外重复一个 SELECT 语句。

使用单独的 .sql(大多数 sql 或没有 sql 引擎)文件的方法如果喜欢在一个文件中编辑代码可能会很麻烦。
至于使用 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;'})

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

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

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