6

I Can't run this query with SQLite

if 0<(select COUNT(*) from Repetition where (Word='behnam' and Topic='mine'))
begin
 update Repetition set Counts=1+ (select Counts from Repetition where (Word='behnam' and Topic='mine'))
end
else
begin
    insert Repetition(Word,Topic,Counts)values('behnam','mine',1)
end

It says "Syntax error near IF" How can I solve the problem

4

4 に答える 4

6

SQLite には IF ステートメントがありません (サポートされているクエリのリストを参照してください) 。

代わりに、別のスレッドでERIC Bの提案を確認してください。UPSERT (レコードが存在する場合は UPdate、存在しない場合は INSERT) の実行を効果的に検討しています。Eric B. は、SQLite の「INSERT OR REPLACE」機能を利用して SQLite 構文でこれを行う方法の良い例を持っています。基本的には、次のようにします。

INSERT OR REPLACE INTO Repetition (Word, Topic, Counts)    
VALUES (  'behnam', 'mine',
          coalesce((select Counts + 1 from Repetition 
                   where Word = 'behnam', AND Topic = 'mine)
                   ,1)
       )
于 2011-11-10T21:44:45.343 に答える
3

もう 1 つのアプローチは、INSERT ... SELECT ... WHERE ... EXISTS [or not] (SELECT ...); です。

私はいつもこの種のことをしており、jklemmack の提案も使用しています。また、UPDATE で JOIN を実行するなど、他の目的でもこれを行います (SQLite3 ではサポートされていません)。

例えば:

CREATE TABLE t(id INTEGER PRIMARY KEY, c1 TEXT NOT NULL UNIQUE, c2 TEXT);
CREATE TABLE r(c1 TEXT NOT NULL UNIQUE, c2 TEXT);
INSERT OR REPLACE INTO t (id, c1, c2)
  SELECT t.id, coalesce(r.c1, t.c1), coalesce(r.c2, t.c2)
  FROM r LEFT OUTER JOIN t ON r.c1 = t.c1
  WHERE r.c2 = @param;

そこにあるWHEREには、IFにある条件があります。SELECT の JOIN は、SQLite3 が UPDATE でサポートしていない JOIN を提供します。INSERT OR REPLACE と t.id (行が t に存在しない場合は NULL になる可能性があります) の使用により、THEN および ELSE 本体が提供されます。

これは何度でも適用できます。IF の THEN 部分に 3 つのステートメント (何とか 1 つにマージできない) がある場合、WHERE に IF 条件を含む 3 つのステートメントが必要です。

于 2012-03-05T23:25:43.180 に答える
0

これは UPSERT (つまり、UPdate または inSERT) と呼ばれます。ほぼすべてのタイプのデータベースにフォームがあります。SQLite バージョンについては、この質問を参照してください: SQLite - UPSERT *not* INSERT または REPLACE

于 2013-06-12T18:49:42.250 に答える