Domanda

Sto lavorando a uno script R che utilizza una lunga stringa SQL e vorrei mantenere la query relativamente libera da altri markup in modo da consentire la copia e l'incollaggio tra editor e applicazioni. Mi piacerebbe anche la possibilità di dividere la query su più righe per una migliore leggibilità.

Nella documentazione RODBC, la funzione paste viene utilizzata per creare la query da blocchi separati, ma preferirei qualcosa di meno kludgy e con meno virgolette e virgole. Grazie per il tuo aiuto.

È stato utile?

Soluzione

puoi sovrascrivere l'operatore% +% per avere una migliore sintassi di concatenazione di stringhe:

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

rendimenti:

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

Altri suggerimenti

Se sei un vecchio programmatore C di ritorno, come me, potresti divertirti usando solo sprintf ().

Prendendo in prestito l'esempio di 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)

rendimenti:

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

Un modo grazioso di " incluso " una lunga query SQL consiste nel mantenerlo in un file .sql separato. Preferibilmente da qualche parte può essere evidenziata la sintassi, un file di testo in RStudio farà il lavoro. Quindi, nel tuo script R principale puoi leggere il file in una stringa e popolarlo con variabili usando una delle molte & Quot; denominata & Quot; sprintf - soluzioni di tipo, come 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) 

Consiglio di usare solo una stringa semplice e di non incorporare valori variabili in essa. Usa invece i segnaposto.

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

Non sono sicuro che la doppia virgoletta sia il modo migliore per incorporare stringhe multilinea nel codice R (c'è qualcosa come here-docs?), ma funziona, diversamente da Java.

C'è qualche motivo per cui non si desidera inviare "\n" o "\t" al database? Dovrebbero andare bene in SQL.

Ho finito semplicemente col colpire la stringa sql con sql <- gsub("\n","",sql) e sql <- gsub("\t","",sql) prima di eseguirla. La stringa stessa può essere lunga quanto deve essere, ma rimane libera da qualsiasi markup di concatenazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top