6

我无法使用 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

它说“IF附近的语法错误”我该如何解决这个问题

4

4 回答 4

6

SQLite 没有 IF 语句(请参阅支持的查询列表

Insetad,在另一个线程上查看ERIC B的建议。您实际上正在考虑执行 UPSERT(如果记录存在则更新,如果不存在则插入)。Eric B. 有一个很好的例子,说明如何利用 SQLite 中的“插入或替换”功能在 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

另一种方法是 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 部分中有三个语句(不能以某种方式合并为一个),那么您需要在其 WHERE 中包含三个带有 IF 条件的语句。

于 2012-03-05T23:25:43.180 回答
0

这称为 UPSERT(即 UPdate 或 inSERT)。它在几乎所有类型的数据库中都有它的形式。查看 SQLite 版本的这个问题:SQLite - UPSERT *not* INSERT or REPLACE

于 2013-06-12T18:49:42.250 回答
0

我发现的一种方法是基于SQL WHERE子句true/false语句:

 SELECT * FROM SOME_TABLE
 WHERE
 ( 
    SELECT SINGLE_COLUMN_NAME FROM SOME_OTHER_TABLE
    WHERE 
    SOME_COLUMN = 'some value' and 
    SOME_OTHER_COLUMN = 'some other value'
  )

这实际上意味着QUERIES如果其他一些QUERY返回“任何”结果,则执行一些。

于 2017-09-14T12:45:50.320 回答