Могу ли я корректно включить форматированные строки SQL в R-скрипт?
Вопрос
Я работаю в R-скрипте, который использует длинную строку SQL, и я хотел бы сохранить запрос относительно свободным от другой разметки, чтобы разрешить копирование и вставку между редакторами и приложениями.Мне также хотелось бы иметь возможность разбивать запрос по строкам для лучшей читабельности.
В документации 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-скрипте преобразовать файл в строку и заполнить его переменными, используя одну из многих "именованных" sprintf
-типовые решения, такие как инфузор.
.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 с помощью sql <- gsub("\n","",sql)
и sql <- gsub("\t","",sql)
перед ее запуском. Сама строка может быть настолько длинной, насколько это необходимо, но без разметки конкатенации.