c - 来自另一个表的 SQLITE UPDATE 字段 IF NULL

标签 c database sqlite

我有一个 具有不同表的数据库。 我正在做的是 UPDATE 表的最后插入行,其中包含来自同一表的另一条记录或来自另一个类似表的数据。

我成功了,但我想知道我的解决方案是否正确或缺少某些内容,以及我是否可以用更紧凑、更快速的方式编写它。

此外,我的代码非常难以管理,因为如果将来表结构发生变化,我将必须重写查询以添加或删除字段。

我在犹豫是否可以写一个 从表中获取整条记录并更新同一表的另一条记录中的所有 NULL 字段的查询。

sprintf(global_sql, "UPDATE "\
                        "Table1 "\
                    "SET "\
                        "fiedl1 = case when fiedl1 is null then (SELECT fiedl1 FROM Table1 WHERE Table1_id = %d) else fiedl1 end, "\
                        "fiedl2 = case when fiedl2 is null then (SELECT fiedl2 FROM Table1 WHERE Table1_id = %d) else fiedl2 end, "\
                        "fiedl3 = case when fiedl3 is null then (SELECT fiedl3 FROM Table1 WHERE Table1_id = %d) else fiedl3 end "\
                    "WHERE "\
                        "Table1_id = (SELECT max(Table1_id) FROM Table1)", sourceRecord_idx, sourceRecord_idx, sourceRecord_idx); 

如您所见,对于每个字段,我必须编写其特定的 SET 案例,而且每个字段的值都是通过选择检索的。

我想/希望有一种更简单、更易于维护的方法来做到这一点。

最佳答案

您可能会认为这更易于维护,
至少它少了一些“三重复制代码”:

with shortcut(f1, f2, f3) as
 (SELECT fiedl1, fiedl2, fiedl3 FROM Table1 WHERE Table1_id = %d)
UPDATE Table1 SET 
  fiedl1 = ifnull(fiedl1, (SELECT f1 FROM shortcut)), 
  fiedl2 = ifnull(fiedl2, (SELECT f2 FROM shortcut)), 
  fiedl3 = ifnull(fiedl3, (SELECT f3 FROM shortcut))
WHERE Table1_id = (SELECT max(Table1_id) FROM Table1)
;

详细信息:

  • 使用 CTE 减少条件重复和其他快捷方式
  • 使用ifnull 使条件值更简单、更短

在 SQLite 3.9.1 上测试,使用固定值而不是 %d

关于c - 来自另一个表的 SQLITE UPDATE 字段 IF NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32840729/

相关文章:

c - 为什么这些代码给我一个 sigsegv 错误?

c - 在简单的阶乘代码中收到奇怪的数学错误,不知道为什么

c - Ip Tunnel 有开源吗?

遍历字符串并标记非字母的 C 程序

android - SQLite 数据库架构 : Empty Tables

java se 与 hibernate 和 JavaDB。我如何部署应用程序?

android - 如何更新 Android SQLITE 中除 Unique Constraint 属性外的所有行属性?

database - 是否有 REST 数据库连接标准?

java - Android 的替代关系数据存储方法

android - 如何将 Android 数据库与在线 SQL Server 同步?