2010-08-10 12 views
6

Używam biblioteki RSQLite w R do zarządzania zestawem danych, który jest zbyt duży dla pamięci RAM. Dla każdej regresji wysyłam zapytanie do bazy danych, aby pobrać rok obrachunkowy naraz. Teraz mam rok obrotowy zakodowane:Zapytanie RSQLite z określoną przez użytkownika zmienną w polu WHERE

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

chciałbym uczynić rok obrotowy (2008 powyżej), aby dokonać zmian nieco łatwiej (i idiotoodporny). Czy istnieje sposób, że mogę przekazać zmienną do ciągu zapytania SQL? Chciałbym użyć:

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

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

Odpowiedz

9

SQLite zobaczy tylko ciąg przekazywana dla zapytania, więc to, co robisz, jest coś takiego jak

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

Dobrą rzeczą jest to, że można to wykorzystać zwykły sposób na odwijanie pętli. Zapominając na chwilę, że masz ograniczenia RAM, koncepcyjnie można zrobić

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

a teraz dane jest lista zawierająca wszystkie swoje coroczne zbiory danych. Lub możesz zachować dane, uruchomić regresję i przechowywać obiekt podsumowania.

+0

Wow! Muszę zinternalizować ten pomysł tworzenia łańcucha za pomocą 'paste' i przekazanie go jako argumentu! Dzięki! –

3

Odpowiedź Dirka jest na miejscu. Jedną z małych rzeczy, które staram się zrobić, to zmienić formatowanie w celu łatwego testowania. Wydaje się, że muszę wielokrotnie wycinać i wklejać tekst SQL do edytora SQL. Więc ja sformatować tak:

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

To właśnie sprawia, że ​​łatwiej wyciąć i wkleić bity SQL in/out do testowania w środowisku kwerendy DB. Bez większego problemu z krótkim zapytaniem, ale może stać się niewygodnym z dłuższym łańcuchem SQL.

+0

Masz na myśli, że wklejasz go z jednego bufora emacs do innego bufora emacs? ;-) –

+0

ouch .. ouch .. przestań mnie szturchać. to boli. Oooo. –

+0

, a przez to rozumiem "przestańcie mi kłaść na duchu moje oczywiste niedostateczne wykorzystanie emacsów" –

Powiązane problemy