【问题标题】:Toggle values in sqlite3在 sqlite3 中切换值
【发布时间】:2012-11-22 17:59:16
【问题描述】:

我的表有一个名为status 的列,数据类型为CHARACTER。我希望执行以下操作。

如果主键的行不存在,则在 status。如果一行已经有一个主键条目,切换 status。使用ativenot_active 值进行切换。

目前我正在通过编写多个查询来做到这一点。有没有像 Mysql 这样的单一查询?

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    SQLite 没有像 IF 这样的控制逻辑命令,因为这在嵌入式数据库中没有意义。

    以您用于访问数据库的任何语言实现控制逻辑:

    db.begin_transaction()
    result = db.execute("SELECT status FROM MyTable WHERE id = ?", [id]);
    if result.length > 0:
        new_status = if result[0][0] == 'active': 'not_active' else: 'active'
        db.execute("UPDATE MyTable SET status = ? WHERE id = ?", [new_status, id])
    else:
        db.execute("INSERT INTO MyTable(id, status) VALUES(?, ?)", [id, 'active'])
    db.commit()
    

    不过,切换逻辑本身可以用CASE expression来实现,所以如果你不太在意清晰度,可以改为执行以下两个命令,按照这个顺序(UPDATE不会做任何事情如果记录不存在,并且如果新记录违反任何唯一约束,INSERT OR IGNORE 将不执行任何操作):

    UPDATE MyTable
    SET status = CASE status
                 WHEN 'active' THEN 'not_active'
                 ELSE               'active'
                 END
    WHERE id = ?;
    
    INSERT OR IGNORE INTO MyTable (id, status) VALUES (?, 'active');
    

    【讨论】:

      猜你喜欢
      • 2015-10-03
      • 2017-12-31
      • 1970-01-01
      • 2018-05-16
      • 2017-02-08
      • 2013-10-02
      • 2016-01-16
      • 1970-01-01
      • 2011-09-05
      相关资源
      最近更新 更多