2009-10-27 1 views
6

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

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

ответ

7

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

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

Мне нравится переопределение. Благодарю. –

+0

Я нахожу shQuote полезным, когда x или y являются строками. –

11

Если вы старый 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 
+0

Мне также нравится использовать sprintf для интерполяции в многострочных строках. Это всегда немного напоминает, как вы привязываете переменные к утверждениям в DBI Perl. И читаем. – medriscoll

1

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

3

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

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

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

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

+1

Как связать значения с этими заполнителями? Я не мог найти ничего в документации RODBC. – 2013-04-23 20:37:34

+0

Некоторые драйверы, похоже, поддерживают его, а некоторые нет. См. Http://stackoverflow.com/questions/2186015/bind-variables-in-r-dbi. –

+0

RODBC не поддерживает параметризованные запросы. RODBCext добавляет это. Похоже, что DBI находится в процессе их добавления. – blongworth

5

Изящный способ «включая« »длинный 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) 
+0

Подготовленное заявление - это более безопасный способ сделать это. –

+0

Подготовленное заявление также намного более эффективно во многих случаях. Если в вашей БД есть оптимизатор кэширования, он может использовать один и тот же план выполнения для одного и того же оператора с различными связанными параметрами, но если вы подставляете параметры непосредственно в SQL, ему, вероятно, придется каждый раз пересчитывать план. –

Смежные вопросы