我无法使用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附近的语法错误” 我该如何解决问题
答案 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'结果,则执行一些查询。