首页 > 解决方案 > 带条件动作的 sqlite 表达式

问题描述

我正在尝试将一些代码从 c# 移动到 sql 语句。目的是速度并且是有保证的。目标是如果找到选择的 id 并对其进行更新。
如果未找到,则尝试另一个选择查询,如果找到,则更新该记录。如果未找到 THAT,则插入一条记录并在更新该 id 记录时使用该插入记录的 id

if  
   select id from table where field1 = "testcase" has a result then update the record andreturn
 else
   select id from table where field2 = "othercase" if there is a result then update the record and return
 else --no record found
 update table field3 = "xx" where id = insert into recorddata values

标签: sqlsqlite

解决方案


SQLite 中没有 if then else 结构,相当于 CASE WHEN THEN ELSE END。但是,您一次只能进行一个这样的声明,尽管这样的声明可能非常复杂。

我认为以下内容符合您的要求,但尚不清楚更新记录的含义或插入记录的含义。

DROP TABLE IF EXISTS thetable;
CREATE TABLE IF NOT EXISTS thetable (id INTEGER PRIMARY KEY, field1, field2, field3);
INSERT INTO thetable (field1,field2,field3) VALUES('testcase','othercase','aa'),('nottestcase','notothercase','bb'),('nottestcase','othercase','cc'),('testcase','notothercase','dd');
SELECT * FROM thetable;
INSERT INTO theTable SELECT null,field1,field2,null FROM thetable WHERE NOT (field1 = 'testcase' OR field2 = 'othercase');
UPDATE theTable SET field3 = (SELECT id FROM thetable WHERE field3 IS NULL) WHERE (NOT (field1 = 'testcase' OR field2 = 'othercase')) AND field3 IS NOT NULL;
UPDATE theTable SET field3 = 'mynewfield3value' WHERE field1='testcase' OR field2 = 'othercase';
SELECT * FROM thetable;
DROP TABLE IF EXISTS thetable; /* cleanup test environment*/
  • 前 3 个语句创建环境,即填充表。
  • 第 4 条语句显示了任何更改之前的表。
  • 如果--no record found 条件 有一行(或多行),则第 5 条语句插入一个新行。
    • 由于问题对于插入 field1 和 field 2 的值或从--no 记录行复制的内容含糊不清,因此自动生成 id(假设 id 是自动生成的典型 id),field3 为 NULL(正在使用以区分新添加的行)。
    • 如果没有--no record,则不会插入任何内容。
  • 第 6 条语句更新其他--found行但不是新插入的--wasn't even there行。
    • 如果很容易选择 field3 为 NULL,则可以轻松更改此行。
  • 第 7 显示了更改后的表格。
  • 8号清理环境(即掉表)

结果 1

在此处输入图像描述

  • 突出显示的行是--no 记录行。

结果 2

在此处输入图像描述

  • 添加了一个 id 为5的新行。
  • --no 记录行已更新为新行的 id 。
  • 第 1,3 和 4 行(--record found行)已更新。
  • 目前尚不清楚新行应该发生什么。

推荐阅读