Puedo correctamente formato de incluir cadenas SQL en una secuencia de comandos de R?

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

  •  06-07-2019
  •  | 
  •  

Pregunta

Estoy trabajando en un R secuencia de comandos que utiliza una larga cadena SQL, y me gustaría mantener la consulta relativamente libre de otras de marcado para permitir copiar y pegar entre los editores y las aplicaciones.También me gustaría la capacidad de dividir la consulta a través de las líneas para una mejor legibilidad.

En el RODBC documentación, la paste la función se utiliza para crear la consulta de separar trozos, pero preferiría algo menos desacoplados y con menos citas y comas.Gracias por tu ayuda.

¿Fue útil?

Solución

puede anular el operador% +% para tener una mejor sintaxis de concatenación de cadenas:

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

rendimientos:

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

Otros consejos

Si eres un antiguo programador de C desde hace mucho tiempo, como yo, tal vez disfrutes usando sprintf ().

Pedir prestado el ejemplo 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)

rendimientos:

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

Una forma elegante de " incluyendo " una consulta SQL larga es mantenerla en un archivo .sql separado. Preferiblemente, en algún lugar donde se pueda resaltar la sintaxis, un archivo de texto en RStudio hará el trabajo. Luego, en su script R principal, puede leer el archivo en una cadena y llenarlo con variables usando uno de los muchos & Quot; llamado & Quot; sprintf - soluciones de tipo, como 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) 

Recomiendo usar una cadena simple y no incrustar valores variables en ella. Utilice marcadores de posición en su lugar.

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

No estoy seguro de si la comilla doble es la mejor manera de incrustar cadenas de varias líneas en el código R (¿hay algo así como documentos aquí?), pero funciona, a diferencia de Java.

¿Hay alguna razón por la que no desea enviar "\n" o "\t" a su base de datos? Deberían estar bien en el SQL.

Yo he terminado simplemente pulsando la cadena sql con sql <- gsub("\n","",sql) y sql <- gsub("\t","",sql) antes de ejecutarlo.La cadena puede ser tan largo como debe ser, pero se mantiene libre de cualquier concatenación de marcado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top