【问题标题】:IF-Statement in SQLite: update or insert?SQLite 中的 IF 语句:更新还是插入?
【发布时间】:2011-12-13 06:48:09
【问题描述】:

我无法使用 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 附近的语法错误” 我该如何解决这个问题

【问题讨论】:

  • 只要使用事务(或其他原子保证),程序-if 始终可以在客户端完成。无论如何,这是一个“upsert”,请参阅SQLite - UPSERT not INSERT or REPLACE - 特别是 Eric B 的回答......请注意使用coalesce 作为“有限的 if”。
  • SQLite 不支持IF ELSE END 子句,对吧?您是在问是否可以在 SQLite 中实现这一点? SQLite 支持CASE 的一些类似 if 的功能,但我认为它不会解决您的问题。 stackoverflow.com/questions/1294619/…

标签: sql if-statement sqlite upsert


【解决方案1】:

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

Insetad,看看 ERIC B 对另一个 thread 的建议。您实际上正在考虑执行 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)
       )

【讨论】:

  • 澄清一下,如果 Word 和 Topic 设置为 UNIQUE,这似乎有效,否则它会创建一个新条目?
【解决方案2】:

另一种方法是 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 条件的语句。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我发现的一种方法是基于 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 返回“任何”结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 2018-02-10
        • 2016-09-18
        • 2016-06-10
        • 2016-05-31
        • 2012-10-06
        相关资源
        最近更新 更多