我有两个表,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
语句单独检查列,如果它们符合我们的条件,则返回列名称(作为字符串),否则返回 空
。
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 |
<小时/>
关于mysql - 比较两个数据库表并显示更改的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57910867/