sql - 如何在 INSERT 中构建 "if-else"SQL 查询?

标签 sql sqlite

我正在尝试将列从一个 SQLite 表复制到另一个,但用枚举(0 到 9)替换 bool 值(0 或 1)。一个给定的项目可以在表中出现两次 - 每个 bool 设置一次。我想用 true 复制记录 bool 优先,如果不存在,那么我想用 false 复制记录 bool 值。

有没有办法在单个查询中做到这一点?

我在下面包含了我当前的方法,但这需要在同一组表上运行多个查询,因此效率低于一个查询。

// Table schemas
Table1(Col1 text, Col2 text, Col3_bool int, Col4 int, Primary Key(Col1, Col2, Col3))
Table2(Col1 text, Col2 text, Col3_enum int, Col4 int, Primary Key(Col1, Col2, Col3))

// Pseudo code
for (int i = 0; i < 10; ++i)
{
    insert into Table2 select Col1, Col2, i, Col4 from Table1 where Col3_bool = 0;
    insert or replace into Table2 select Col1, Col2, i, Col4 from Table1 where Col3_bool = 1;
}

最佳答案

只要您对所有查询使用单个事务,就不太可能出现任何性能差异。

对于每个 Col1/Col2组合,你想要最大Col3值(value):

SELECT Col1, Col2, MAX(Col3_bool)
FROM Table1
GROUP BY Col1, Col2

然后,您可以使用这些值来获取所需的行:
SELECT Table1.Col1,
       Table1.Col2,
       Table1.Col3_bool,
       Table1.Col4
FROM Table1
JOIN (SELECT Col1,
             Col2,
             MAX(Col3_bool) AS Col3_bool
      FROM Table1
      GROUP BY Col1,
               Col2
     ) USING (Col1, Col2, Col3_bool)

要为这些行中的每一行获取十行,请与另一个具有十个值的表进行交叉连接:
INSERT INTO Table2
SELECT Table1.Col1,
       Table1.Col2,
       enums.i,
       Table1.Col4
FROM Table1
JOIN (SELECT Col1,
             Col2,
             MAX(Col3_bool) AS Col3_bool
      FROM Table1
      GROUP BY Col1,
               Col2
     ) USING (Col1, Col2, Col3_bool)
JOIN (SELECT 0 AS i UNION ALL
      SELECT 1      UNION ALL
      SELECT 2      UNION ALL
      SELECT 3      UNION ALL
      SELECT 4      UNION ALL
      SELECT 5      UNION ALL
      SELECT 6      UNION ALL
      SELECT 7      UNION ALL
      SELECT 8      UNION ALL
      SELECT 9) AS enums

关于sql - 如何在 INSERT 中构建 "if-else"SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24855638/

相关文章:

SQL:一组结果中有两个查询?

sql - 如何在 SQL 中进行渐进式递增每个 x 记录,其中每行的 x 可能不同?

sql - 对于这种情况,为什么 SQL Azure 数据库性能在 Web 版和新高级版上差异如此之大

MySQL根据出生日期计算年龄

android - 获取 SQLiteException 并且我不确定是什么原因造成的

android - 在 sqlite android 中创建表

sql - regexp_replace oracle 的替换部分

java - 如何使用sqlite制作可执行的java应用程序

android - 将 SQLite 列更新为 null 而不影响其他列

android - 删除项目后如何更新列表?