3

我的表有一个名为statusdata type的列CHARACTER。我希望做到以下几点。

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

目前我正在通过编写多个查询来做到这一点。是否有任何单个查询可以像 Mysql 一样执行此操作?

4

1 回答 1

3

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表达式来实现,所以如果你不太在意清晰度,你可以按照这个顺序执行以下两个命令(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');
于 2012-11-22T09:59:16.467 回答