stackoverflow 上有很多例子可以让你得到两个表的行之间的差异,但是如果我想在重复的情况下得到一个空字段,它们不会考虑重复项。我没有找到合适的例子。例如有一个请求:
SELECT Id, username FROM table1
WHERE (Id, username) NOT IN (SELECT Id, username FROM table2)
这将输出表 1 中的行,考虑到 id,这些行不存在于表 2 中,但我需要在行字段重复的情况下,查询显示一个空字段以比较多个列。
示例表 1
id | name | surname
--------------------
1 | Jhon | Zero
2 | Test | First
3 | Mike | Second
4 | James | Third
5 | Ivan | Fourth
6 | Jhon | Zero
表2
id | name | surname
--------------------
1 | Jhon | Test0
2 | JACK | First
3 | MIKE | Second3
4 | Jame | Third4
5 | Evan | Fourth
6 | Jhon | Zero
SELECT输出结果
id | name | surname
--------------------
1 | | Zero
2 | Test |
3 | Mike | Second
4 | James | Third
5 | Ivan |
6 | |
那些。输出字符串时,我需要让重复字段等于 Null - 一个空值,而且所有内容都区分大小写。请写下如何做到这一点,甚至可以使用 mysql。
最佳答案
假设您已使用区分大小写的排序规则创建表,此查询将为您提供所需的结果。它使用 CASE
表达式来比较每个表中的值,只有当它们不同时才输出值。
SELECT t1.id,
CASE WHEN t1.name != t2.name THEN t1.name END AS name,
CASE WHEN t1.surname != t2.surname THEN t1.surname END AS surname
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id
输出
id name surname
1 null Zero
2 Test null
3 Mike Second
4 James Third
5 Ivan null
6 null null
如果您的表具有不区分大小写的排序规则,您将需要重新排序查询中的各个值:
SELECT t1.id,
CASE WHEN t1.name COLLATE latin1_general_cs != t2.name COLLATE latin1_general_cs THEN t1.name END AS name,
CASE WHEN t1.surname COLLATE latin1_general_cs != t2.surname THEN t1.surname COLLATE latin1_general_cs END AS surname
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id;
关于MYSQL请求显示两张表行的差异并根据行id删除重复字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57600254/