2013-07-29 57 views
0

我有一個簡單的Sqlite表,其中有2列用於電話號碼和計數器。我想在包含電話號碼和計數器的.csv文件的基礎上更新表格。如果該數字存在於數據庫中,則應該使用文件中現有計數器+計數器的總和進行更新。如果不存在,則應使用文件中的值插入新記錄。 我剩下的一個問題是電話號碼在第一位置有一個零。 當我填充數據庫零保留,(我可以手動選擇並找到一個現有的數字,如09999)時,我從文件保留零值,但當我嘗試插入/更新的東西發生在我的Ruby代碼中的值插入一個沒有前導零的新記錄,所以0999在db中變爲999。沒有前導零的數字被正確處理。 我的代碼如下所示:用Ruby在Sqlite中插入/更新數字字符串(新手查詢)

rowArray=thisFile[k].split(';') 
number = rowArray[0] 
couplings = rowArray[1] 


updString="INSERT OR REPLACE INTO Caller (Telno,count) VALUES (#{number},COALESCE((SELECT count + #{couplings} FROM Caller WHERE Telno=#{number}),# {couplings}))" 

db.execute(updString) 

任何想法,我做錯了什麼?最簡單的解決方案是放棄前導零,但我寧願做正確的。提前謝謝了。

回答

0

您需要在prepare調用中使用10佔位符,並將調用中的實際值傳遞給execute。像這樣

insert = db.prepare(<<__SQL__) 
INSERT OR REPLACE INTO Caller (Telno, count) 
VALUES (:number, COALESCE((SELECT count + :couplings FROM Caller WHERE Telno = :number), :couplings)) 
__SQL__ 

insert.execute(number: number, couplings: couplings) 

(請注意,在SQL語句:number:couplings命名佔位符,它們可以是任何東西,但我選擇了他們匹配的是要綁定的變量的相應的名稱。)

的問題是,用簡單的插值,你最終像

INSERT OR REPLACE INTO Caller (Telno, count) VALUES (0999, ... 

字符串和0999似乎是一個數字,而TH一個字符串。如果您將字符串傳遞給execute,那麼變量將以正確的類型綁定。

+0

感謝鮑羅丁,修復它,現在我明白了機制。 – user2630253