2012-11-29 21 views
1

我的代碼如下:我的sqlite3 CASE語句有什麼問題?

SELECT COUNT(_id) AS count FROM general WHERE _id = 1 CASE WHEN count > 0 THEN UPDATE general SET userGivenId = 'xxx' WHERE _id = 1 ELSE INSERT INTO general (userGivenId) VALUES ('xxx') END 

與錯誤:

android.database.sqlite.SQLiteException: near "CASE": syntax error: , while compiling: SELECT COUNT(_id) AS count FROM general WHERE _id = 1 CASE WHEN count > 0 THEN UPDATE general SET userGivenId = 'xxx' WHERE _id = 1 ELSE INSERT INTO general (userGivenId) VALUES ('xxx') END 

這是我會用最短的查詢。爲什麼我這樣做是因爲我的其他查詢將有需要更新的行,但有些可能不會被觸及。使用替換將取代所有數據(至少這是我的Android手機上的工作原理)。例如我的File類將有一個filePath,但有時來自服務器的響應將返回null,我只是爲了更新文件如果服務器返回一個新的文件。

我忘了寫什麼嗎?

回答

1

SQLite沒有任何控制邏輯,因爲這在嵌入式數據庫中沒有意義(沒有單獨的服務器機器/進程,其異步執行可以提高性能)。 CASE只能用於表達式,而不能用於整個命令。

手柄控制邏輯在你的應用程序:

Cursor c = db.rawQuery("SELECT 1 FROM general WHERE _id = 1", null); 
if (c.moveToFirst()) 
    db.execSQL("UPDATE general SET userGivenId = 'xxx' WHERE _id = 1"); 
else 
    db.execSQL("INSERT INTO general (userGivenId) VALUES ('xxx')"); 

對於這些特定的命令,如果你對_id列的唯一約束(和主鍵約束是唯一的),你可以使用INSERT OR REPLACE指令:

INSERT OR REPLACE INTO general(_id, userGivenId) VALUES(1, 'xxx') 
+0

謝謝,它運作良好。我的INSERT或REPLACE沒有工作,因爲我沒有使用唯一的約束。 –