我有两个表,tmp1和tmp2:

tmp1:

+----+------+---------+---------+
| id | name | add1    | add2    |
+----+------+---------+---------+
| 1  | NULL | NULL    | NULL    |
| 2  | mum  | rajpur  | rajpur1 |
| 3  | mum1 | rajpur1 | rajpur2 |
| 4  | mum3 | rajpur3 | rajpur4 |
| 5  | mum4 | rajpur4 | rajpur5 |
+----+------+---------+---------+


tmp2:

+----+------+---------+---------+
| id | name | add1    | add2    |
+----+------+---------+---------+
| 1  | NULL | NULL    | NULL    |
| 2  | mum  | rajpur  | rajpur1 |
| 3  | mum1 | rajpur6 | rajpur7 |
| 4  | mum3 | rajpur3 | rajpur8 |
| 5  | mum4 | rajpur4 | rajpur5 |
+----+------+---------+---------+


在这里,我应用了一个sql查询,不过,与第二个表相比,空值属性的id或不匹配值属性的id将从第一张表中检索:

SELECT a.id
FROM   tmp1 a
       INNER JOIN tmp2 b
               ON a.id = b.id
                  AND ( ( a.name IS NULL
                           OR a.add1 IS NULL
                           OR a.add2 IS NULL )
                         OR ( a.name != b.name
                               OR a.add1 != b.add1
                               OR a.add2 != b.add2 ) );


上面的sql查询给了我下面的结果:

+----+
| id |
+----+
| 1  |
| 3  |
| 4  |
+----+


很好,使用上面的查询,我得到了想要的结果。

现在,我想检索与第二张表相比在第一张表中出现更改的那些列名,或者在第一张表中保留列名的空值,我希望我的结果如下所示:

+----+-----------------+
| id | Changed Columns |
+----+-----------------+
| 1  | name,add1,add2  |
| 3  | add1,add2       |
| 4  | add2            |
+----+-----------------+

最佳答案

您可以将Concat_ws()函数与使用CASE .. WHEN的条件检查一起使用。关于Concat_Ws函数的好处是,如果参数列表中有NULL值,它将忽略它(而不是串联它)。

因此,我们可以使用CASE .. WHEN语句分别检查列,如果它们符合我们的条件,则返回列名(作为字符串),否则返回null

SELECT
  a.id,
  CONCAT_WS(',',
            CASE WHEN a.name IS NULL OR a.name <> b.name THEN 'name' ELSE NULL END,
            CASE WHEN a.add1 IS NULL OR a.add1 <> b.add1 THEN 'add1' ELSE NULL END,
            CASE WHEN a.add2 IS NULL OR a.add2 <> b.add2 THEN 'add2' ELSE NULL END
           ) AS Changed_Columns
FROM   tmp1 a
       INNER JOIN tmp2 b
               ON a.id = b.id
                  AND ( ( a.name IS NULL
                           OR a.add1 IS NULL
                           OR a.add2 IS NULL )
                         OR ( a.name <> b.name
                               OR a.add1 <> b.add1
                               OR a.add2 <> b.add2 ) );


结果

| id  | Changed_Columns |
| --- | --------------- |
| 1   | name,add1,add2  |
| 3   | add1,add2       |
| 4   | add2            |




View on DB Fiddle

关于mysql - 比较两个数据库表并显示更改的列名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57910867/

10-13 08:42