我正在使用一个长 SQL 字符串的 R 脚本,并且我希望保持查询相对不受其他标记的影响,以便允许在编辑器和应用程序之间进行复制和粘贴。我还希望能够跨行拆分查询以获得更好的可读性。

在 RODBC 文档中, paste 函数用于从单独的块中构建查询,但我更喜欢不那么笨拙并且引号和逗号更少的东西。感谢您的帮助。

有帮助吗?

解决方案

您可以覆盖%+%运算符以获得更好的字符串连接语法:

'%+%' <- 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 

其他提示

如果你是一名老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 

<!>的优雅方式;包括<!>“长SQL查询是将其保存在单独的.sql文件中。最好在某处它可以突出显示语法,RStudio中的文本文件将完成这项工作。然后,您可以在主R脚本中将文件读入一个字符串,并使用众多<!> quot; named <!>中的一个来填充变量。 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) 

我建议仅使用纯字符串,而不是在其中嵌入变量值。请改用占位符。

sql <- "SELECT foo FROM bar
    WHERE col1 = ?
    AND col2 = ?
    ORDER BY yomama"

我不确定双引号是否是在 R 代码中嵌入多行字符串的最佳方式(有类似​​here-docs 的东西吗?),但它确实有效,与 Java 不同。

您是否有什么原因不想发送 "\n" 或者 "\t" 到你的数据库?它们在 SQL 中应该没问题。

我最终只是在运行之前用sql <- gsub("\n","",sql)sql <- gsub("\t","",sql)命中sql字符串。字符串本身可以是它所需的长度,但不受任何串联标记的影响。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top