我正在研究如何将数据从服务器直接读入R中的数据框。过去我编写了超过50行的SQL查询(包含所有选择和连接)。关于如何在R中编写长查询的任何建议?有没有办法在R中的其他地方编写查询,然后将其粘贴到代码的“sqlQuery”部分?
答案 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;'})
甚至可以在函数内折叠(折叠长参数),或者在我们的代码扩展到不方便的大小的其他情况下折叠查询。