在R中编写冗长的SQL查询

时间:2015-04-07 17:42:25

标签: mysql sql sql-server r rodbc

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

4 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:1)

您可以将任何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)

答案 2 :(得分:0)

我有这个问题尝试通过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语句。

答案 3 :(得分:0)

如果想在一个文件中编辑代码,使用单独的.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;'})

Fold 14-lines long query to one-line

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

Folding whatever you like