2

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

表名 - 旧

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

表名 - 新建

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

两个表的区别如下:

  • 第 1 行 (id=wx):titleviews没有改变。
  • 第 2 行 (id=np):views增加了,而title是相同的。
  • 第 3 行 (id=zo):title已经改变,而views是相同的。
  • 第 4 行 (id=lf):两者titleviews发生了变化。

期望的结果

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

id是恒定的,不会改变。

查询结果

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

我得到的最接近的是

SELECT * FROM new EXCEPT SELECT * FROM old;

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

将不胜感激任何帮助。

4

2 回答 2

1

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

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

请参阅演示

于 2021-08-20T07:48:57.113 回答
0

我认为这是NULLIF功能的情况。从文档

如果参数不同,则 nullif(X,Y) 函数返回其第一个参数,如果参数相同,则返回 NULL。nullif(X,Y) 函数从左到右搜索其参数以查找定义整理函数并将该整理函数用于所有字符串比较的参数。如果 nullif() 的两个参数都没有定义整理函数,则使用 BINARY。

因此,您可以在 上 JOIN 两个表id并传递每一列NULLIF

SELECT
    new.id
    , NULLIF(new.title, old.title)
    , NULLIF(new.views, old.views)
FROM
    new
    JOIN old ON new.id = old.id
;
于 2021-08-20T07:48:19.127 回答