Могу ли я корректно включить форматированные строки SQL в R-скрипт?

StackOverflow https://stackoverflow.com/questions/1630724

  •  06-07-2019
  •  | 
  •  

Вопрос

Я работаю в 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) перед ее запуском. Сама строка может быть настолько длинной, насколько это необходимо, но без разметки конкатенации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top