繁体   English   中英

我可以在 R 脚本中优雅地包含格式化的 SQL 字符串吗?

[英]Can I gracefully include formatted SQL strings in an R script?

我正在使用一个使用长 SQL 字符串的 R 脚本,我想保持查询相对没有其他标记,以便允许在编辑器和应用程序之间复制和粘贴。 我还希望能够跨行拆分查询以提高可读性。

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

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

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

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

“包含”长 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) 

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

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 字符串。 字符串本身可以根据需要长,但不包含任何连接标记。

您现在可以使用胶水轻松完成此操作,允许您编写类似的代码

glue_sql("
  SELECT {`var`}
  FROM {`tbl`}
  WHERE {`tbl`}.sepal_length > {num}
    AND {`tbl`}.species = {val}
  ", .con = con)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM