首页 > 解决方案 > 在 SQLite 中,如何查询两个表中更改的值,并将匹配的值设为 NULL

问题描述

如果我在两个不同的表中有两行,例如:

表名 - 旧

ID 标题 意见
wx 如何清洁钻头 30
np 最疯狂的失败 400
饮食挑战 8
如果 JavaScript 教程 0

表名 - 新建

ID 标题 意见
wx 如何清洁钻头 30
np 最疯狂的失败 450
这是一个错误 8
如果 学习 JavaScript 20

两个表的区别如下:

期望的结果

我想要一个返回Table Name - New的查询,但任何未从Table Name - Old更改的值都应该是null,而不是id. 如果整行没有更改,则不应返回该行。

id是恒定的,不会改变。

查询结果

ID 标题 意见
np null 450
这是一个错误 null
如果 学习 JavaScript 20

我得到的最接近的是

SELECT * FROM new EXCEPT SELECT * FROM old;

但这并没有null排除不变的值。

将不胜感激任何帮助。

标签: sqlsqlitesql-nullnullif

解决方案


加入表并检查相应的列是否不同:

SELECT o.id,
       NULLIF(n.title, o.title) title,
       NULLIF(n.views, o.views) views
FROM Old o INNER JOIN New n
ON n.id = o.id
WHERE n.title <> o.title OR n.views <> o.views;

如果列titleviews可能包含空值,则用于IS NOT比较它们:

SELECT o.id,
       NULLIF(n.title, o.title) title,
       NULLIF(n.views, o.views) views
FROM Old o INNER JOIN New n
ON n.id = o.id
WHERE n.title IS NOT o.title OR n.views IS NOT o.views

请参阅演示


推荐阅读