2010-08-10 17 views
6

我正在使用R in中的RSQLite庫來管理對於RAM來說太大的數據集。對於每次迴歸,我一次查詢數據庫以檢索會計年度。現在我有本財年的硬編碼:使用WHERE字段中的用戶指定變量進行RSQLite查詢

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

我想使本財年(2008以上)進行更改更容易一點(和防呆)。有沒有辦法,我可以傳遞一個變量到SQL查詢字符串?我喜歡使用:

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

相似之一:http://stackoverflow.com/questions/3416973/dynamic-string-in-r – Marek 2010-12-04 22:00:33

回答

9

的SQLite只能看到傳下來的查詢字符串,所以你要做的就是像

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

的好處是,你可以使用這個平常展開循環的方式。忘記了第二,你必須RAM的限制,在概念上可以做

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

,現在的數據是包含了所有的年度數據集的列表。或者你可以保留數據,運行你的迴歸,並只存儲彙總對象。

+0

哇!我需要內化這個想法,用'paste'創建一個字符串並將它作爲參數傳遞!謝謝! – 2010-08-10 14:09:07

3

Dirk的答案是現貨。我嘗試做的一件事是更改格式以便於測試。似乎我必須多次將SQL文本剪切並粘貼到SQL編輯器中。因此,我的格式如下:

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

這只是簡化了在數據庫查詢環境中剪切和粘貼SQL位以進行測試。對於一個簡短的查詢沒什麼大不了的,但是用更長的SQL字符串可能會很麻煩。

+0

你的意思是你從一個emacs緩衝區粘貼到另一個emacs緩衝區? ;-) – 2010-08-10 14:55:56

+0

ouch ..哎喲..不要在那裏戳我。好痛。哎喲。 – 2010-08-10 15:09:06

+0

,我的意思是「停止戳我眼中的emacs我明顯利用不足」 – 2010-08-12 14:32:50

相關問題