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

时间:2015-09-29 09:42:19

标签: 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个案,而且每个字段的值都由select检索。

我想/希望有一种更简单,更易于维护的方法。

1 个答案:

答案 0 :(得分:1)

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

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