我的sqlite3 CASE语句出了什么问题?

时间:2012-11-29 10:32:14

标签: android sqlite 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

这是我将使用的最短查询。为什么我这样做是因为我的其他查询将有需要更新的行,但有些可能无法触及。使用replace将替换所有数据(至少这是我在Android手机上的工作方式)。例如,我的File类将有一个filePath,但有时来自服务器的响应将返回null,我只是更新文件,如果服务器返回一个新文件。

我忘了写任何东西吗?

1 个答案:

答案 0 :(得分: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')