sql - 在 SQLite 中,如何查询两个表中更改的值,并将匹配的值设为 NULL
问题描述
如果我在两个不同的表中有两行,例如:
表名 - 旧
ID | 标题 | 意见 |
---|---|---|
wx | 如何清洁钻头 | 30 |
np | 最疯狂的失败 | 400 |
佐 | 饮食挑战 | 8 |
如果 | JavaScript 教程 | 0 |
表名 - 新建
ID | 标题 | 意见 |
---|---|---|
wx | 如何清洁钻头 | 30 |
np | 最疯狂的失败 | 450 |
佐 | 这是一个错误 | 8 |
如果 | 学习 JavaScript | 20 |
两个表的区别如下:
- 第 1 行 (id=wx):
title
并views
没有改变。 - 第 2 行 (id=np):
views
增加了,而title
是相同的。 - 第 3 行 (id=zo):
title
已经改变,而views
是相同的。 - 第 4 行 (id=lf):两者
title
都views
发生了变化。
期望的结果
我想要一个返回Table Name - New的查询,但任何未从Table Name - Old更改的值都应该是null
,而不是id
. 如果整行没有更改,则不应返回该行。
id
是恒定的,不会改变。
查询结果
ID | 标题 | 意见 |
---|---|---|
np | null |
450 |
佐 | 这是一个错误 | null |
如果 | 学习 JavaScript | 20 |
我得到的最接近的是
SELECT * FROM new EXCEPT SELECT * FROM old;
但这并没有null
排除不变的值。
将不胜感激任何帮助。
解决方案
加入表并检查相应的列是否不同:
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;
如果列title
和views
可能包含空值,则用于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
请参阅演示。
推荐阅读
- python - sam deploy 失败并出现错误存储桶位于此区域:us-east-2。请将此区域用于 us-east-2
- python - 'builtin_function_or_method' 对象没有属性 'apply' cv2
- c++ - 用C++从一个段落中找到一个句子中的最大单词数
- rest - 使用 Bitrix 24 REST API 将 CRM 项目链接到日历事件
- angular - Highcharts:在 X/Y 轴末端添加箭头
- reactjs - React js路由未显示组件
- winforms - 将字符串转换为数学表达式 [arduino]
- python-asyncio - 使用 asyncio.run,多次运行是否安全?
- php - 使用 Guzzle Post 发送数据,响应状态 = 200 但正文为空(null)?
- java - 如何在firebase数据库中搜索