2010-08-10 6 views
6

Sto utilizzando una libreria RSQLite in R in per gestire un set di dati che è troppo grande per la RAM. Per ogni regressione, interrogo il database per recuperare un anno fiscale alla volta. Ora ho l'anno fiscale hard-coded:Query RSQLite con variabile specificata dall'utente nel campo WHERE

data.annual <- dbGetQuery(db, "SELECT * FROM annual WHERE fyear==2008") 

vorrei fare l'anno fiscale (2008 sopra) per apportare le modifiche un po 'più facile (e infallibile). C'è un modo per passare una variabile in una stringa di query SQL? Mi piacerebbe usare:

fiscal.year <- 2008 
data.annual <- dbGetQuery(db, "SELECT * FROM annual WHERE fyear==fiscal.year") 
+0

Simile: http://stackoverflow.com/questions/3416973/dynamic-string-in-r – Marek

risposta

9

SQLite vedrà solo la stringa tramandata per la query, in modo da ciò che si fa è qualcosa di simile

sqlcmd <- paste("SELECT * FROM annual WHERE fiscal=", fiscal.year, sep="") 
    data.annual <- dbGetQuery(db, sqlcmd) 

La cosa bella è che è possibile utilizzare questo il solito modo per srotolare i loop. Dimenticando per un secondo che si dispone di restrizioni di RAM, concettualmente si può fare

years <- seq(2000,2010) 
    data <- lapply(years, function(y) { 
    dbGetQuery(db, paste("SELECT * FROM annual WHERE fiscal=", y, sep="") 
    } 

e ora i dati è una lista contenente tutti i set di dati annuali. Oppure puoi conservare i dati, eseguire la regressione e archiviare solo l'oggetto di riepilogo.

+0

Wow! Ho bisogno di interiorizzare questa idea di creare una stringa con 'incolla' e passarla come argomento! Grazie! –

3

La risposta di Dirk è azzeccata. Una piccola cosa che cerco di fare è cambiare la formattazione per un facile test. Sembra che devo tagliare e incollare il testo SQL in un editor SQL molte volte. Così ho formato simile a questo:

sqlcmd <- paste(" 
    SELECT * 
    FROM annual 
    WHERE fiscal= 
", fiscal.year, sep="") 
data.annual <- dbGetQuery(db, sqlcmd) 

Questo rende solo più facile da tagliare e incollare i bit di SQL in/out per i test nel proprio ambiente di query DB. Nessun problema con una query breve, ma può diventare ingombrante con una stringa SQL più lunga.

+0

Vuol dire che lo si incolla da un buffer emacs in un altro buffer emacs? ;-) –

+0

ahi .. ahi .. smettila di farmi il culo lì. fa male. Ahia. –

+0

e con questo intendo "smettetela di guardarmi negli occhi con la mia evidente sottoutilizzazione di emacs" –

Problemi correlati