我正在使用一个使用长SQL字符串的R脚本,我希望保持查询相对没有其他标记,以便允许在编辑器和应用程序之间进行复制和粘贴。我还希望能够跨行分割查询以提高可读性。
在RODBC文档中,paste
函数用于从单独的块中构建查询,但我更喜欢一些不那么笨拙且引号和逗号较少的内容。谢谢你的帮助。
答案 0 :(得分:12)
如果你是一名老C程序员,就像我一样,你可能只喜欢使用sprintf()。
借用伊恩的例子:
y<-"y1"
x<-"somethingorother"
query <- sprintf(
'SELECT DISTINCT x AS %s,
y AS %s,
FROM tbl
WHERE id=%%s
AND num=%%d', x, y)
的产率:
> cat(query,"\n")
SELECT DISTINCT x AS somethingorother,
y AS y1,
FROM tbl
WHERE id=%s
AND num=%d
答案 1 :(得分:7)
您可以覆盖%+%运算符以获得更好的字符串连接语法:
'%+%' <- function(x,y) paste(x,y,sep="")
y<-"y1"
x<-"somethingorother"
query<-
'SELECT DISTINCT x AS ' %+% x %+%',\n' %+%
' y AS ' %+% y %+% '\n' %+%
' FROM tbl
WHERE id=%s
AND num=%d'
cat(query,"\n")
的产率:
> cat(query,"\n")
SELECT DISTINCT x AS somethingorother,
y AS y1
FROM tbl
WHERE id=%s
AND num=%d
答案 2 :(得分:6)
“包含”长SQL查询的优雅方式是将其保存在单独的.sql
文件中。最好在某处它可以突出显示语法,RStudio中的文本文件将完成这项工作。然后,您可以在主R脚本中将文件读入字符串,并使用众多“命名”sprintf
类型解决方案之一(例如infuser)填充变量。
<强>的.sql 强>
select *
from mytable
where id = {{a}}
and somevar = {{b}}
<强> .R 强>
library(readr)
library(infuser)
query <- read_file("query.sql") %>%
infuse(a = 1, b = 2)
答案 3 :(得分:3)
我建议只使用普通字符串,而不是将变量值嵌入其中。改为使用占位符。
sql <- "SELECT foo FROM bar
WHERE col1 = ?
AND col2 = ?
ORDER BY yomama"
我不确定双引号是否是在R代码中嵌入多行字符串的最佳方式(有类似here-docs的东西吗?),但它确实有效,与Java不同。
是否有某些原因您不想将"\n"
或"\t"
发送到您的数据库?它们在SQL中应该没问题。
答案 4 :(得分:1)
我最终只是在运行它之前用sql <- gsub("\n","",sql)
和sql <- gsub("\t","",sql)
命中sql字符串。字符串本身可以是它所需的长度,但不受任何串联标记的影响。