SQLite中的IF语句:更新还是插入?

时间:2011-10-22 18:21:32

标签: sql if-statement sqlite upsert

我无法使用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 个答案:

答案 0 :(得分:6)

SQLite没有IF语句(see the list of supported queries

Insetad,请查看 ERIC B 对另一个thread的建议。您正在有效地查看执行UPSERT(如果记录存在则更新,如果不存在则INSERT)。 Eric B.有一个很好的例子,说明如何在SQLite语法中使用SQLite中的“INSERT OR REPLACE”功能。基本上,你会做类似的事情:

INSERT OR REPLACE INTO Repetition (Word, Topic, Counts)    
VALUES (  'behnam', 'mine',
          coalesce((select Counts + 1 from Repetition 
                   where Word = 'behnam', AND Topic = 'mine)
                   ,1)
       )

答案 1 :(得分:3)

另一种方法是INSERT ... SELECT ... WHERE ... EXISTS [或不](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;

你的IF中有条件。 SELECT中的JOIN提供了SQLite3在UPDATE中不支持的JOIN。 INSERT OR REPLACE和t.id的使用(如果t中不存在该行,则可以为NULL)一起提供THEN和ELSE主体。

你可以一遍又一遍地申请。如果在IF的THEN部分中有三个语句(不能以某种方式合并为一个语句),则需要在WHERE中使用IF条件的三个语句。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我发现的一种方法是基于SQL WHERE 子句的真/假声明:

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'
  )

这实际上意味着如果某些其他查询返回'any'结果,则执行一些查询。