1

私のコードは次のとおりです。

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 を返す場合があり、サーバーが新しいファイルを返す場合にのみファイルを更新する必要があります。

何か書き忘れていませんか?

4

1 に答える 1

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')
于 2012-11-29T13:27:51.497 に答える