mysql - 比较两个数据库表并显示更改的列名

标签 mysql

我有两个表,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            |
<小时/>

View on DB Fiddle

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

相关文章:

mysql - 不同的 MySQL 结果

MySQL:从连接表中获取每个最新条目

mysql - 在 Nodejs MySQL 中运行多个查询

PHP 在 while 循环中从输入表单中获取值

mysql - 我的查询显示 heidisql 错误,不知道如何修复

MySQL 使用同一表中的数据进行更新

mysql - 如何对特定行使用求和查询

php - yajra/laravel-datatables 搜索不适用于 laravel 5.4

mysql - 使用 Doctrine ORM ManyToOne Relationship 在相反方向获取实体

MySQL 子查询/连接的替代方案