Pergunta

Eu estou trabalhando em um script R que usa uma string SQL longa, e eu gostaria de manter a consulta relativamente livre de outra marcação de modo a permitir copiando e colando entre editores e aplicações. Eu também gostaria que a capacidade de dividir a consulta em todas as linhas para melhor legibilidade.

Na documentação RODBC, a função paste é usado para construir a consulta fora de pedaços separados, mas eu prefiro algo menos kludgy e com menos citações e vírgulas. Obrigado por sua ajuda.

Foi útil?

Solução

Você pode substituir o operador%% + para ter uma melhor sintaxe de concatenação:

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

rendimentos:

> cat(query,"\n")
SELECT DISTINCT x AS somethingorother,
                y AS y1
 FROM tbl
 WHERE id=%s
 AND num=%d 

Outras dicas

Se você é um programador C velho do caminho de volta, como eu sou, você pode desfrutar de apenas usando sprintf ().

O empréstimo exemplo de Ian:

y<-"y1"
x<-"somethingorother"
query <- sprintf(
'SELECT DISTINCT x AS %s,
                 y AS %s,
 FROM tbl
 WHERE id=%%s
 AND num=%%d', x, y)

rendimentos:

> cat(query,"\n")
SELECT DISTINCT x AS somethingorother,
                 y AS y1,
 FROM tbl
 WHERE id=%s
 AND num=%d 

Uma maneira graciosa de "incluindo" uma consulta SQL longa é mantê-lo em um arquivo .sql separado. De preferência em algum lugar ele pode ser sintaxe realçada, um arquivo de texto em rstudio irá fazer o trabalho. Você pode, então, em seu script R principal ler o arquivo em uma string e preenchê-lo com variáveis ??usando uma das muitas soluções "chamado" do tipo sprintf, como infusor .

.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) 

Eu recomendo apenas usando uma corda simples, e não a incorporação de valores de variáveis ??para ele. Usar as substituições em seu lugar.

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

Eu não tenho certeza se o aspas duplas é a melhor maneira de cordas multi-linha incorporar no código R (existe algo como aqui-docs?), Mas ela não funciona, ao contrário de Java.

Existe algum motivo você não quiser enviar "\n" ou "\t" ao seu banco de dados? Eles devem estar bem no SQL.

Eu acabei simplesmente bater a string sql com sql <- gsub("\n","",sql) e sql <- gsub("\t","",sql) antes de executá-lo. A corda em si pode ser tão longo quanto ele precisa ser, mas acomodada sem qualquer marcação concatenação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top