Можно ли изящно включить отформатированные строки SQL в сценарий R? - PullRequest
7 голосов
/ 27 октября 2009

Я работаю в сценарии R, который использует длинную строку SQL, и я хотел бы сохранить в запросе относительно свободную от другой разметки, чтобы позволить копирование и вставку между редакторами и приложениями. Мне также хотелось бы иметь возможность разбивать запрос по строкам для лучшей читаемости.

В документации RODBC функция paste используется для построения запроса из отдельных кусков, но я бы предпочел что-то менее хитрое и с меньшим количеством кавычек и запятых. Спасибо за вашу помощь.

Ответы [ 5 ]

12 голосов
/ 27 октября 2009

Если вы старый программист на 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 
7 голосов
/ 27 октября 2009

вы можете переопределить оператор% +%, чтобы улучшить синтаксис конкатенации строк:

'%+%' <- 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 
6 голосов
/ 10 октября 2016

Изящный способ «включая» длинный 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 голосов
/ 29 октября 2009

Я бы порекомендовал просто использовать простую строку, а не встраивать в нее значения переменных.Вместо этого используйте заполнители.

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

Я не уверен, является ли двойная кавычка лучшим способом встраивания многострочных строк в код R (есть что-то вроде here-docs?), Но этоработать, в отличие от Java.

Есть ли причины, по которым вы не хотите отправлять "\n" или "\t" в свою базу данных?Они должны быть хороши в SQL.

1 голос
/ 28 октября 2009

В итоге я просто нажал на строку sql с sql <- gsub("\n","",sql) и sql <- gsub("\t","",sql), прежде чем запустить ее. Сама строка может быть настолько длинной, насколько это необходимо, но без разметки конкатенации.

...