将 NULL 分配给 SQL 中不同列中的重复值

Assign NULL to repeated values in different columns in SQL

我有一个 table 这样的:

id mail_1 mail_2 mail_3
1 john john_v2 NULL
2 clarisse clarisse clarisse_company
3 NULL julie NULL
4 mark markus_91 mark
5 alfred alfred alfred

而且我想在邮件重复的地方放NULL,例如第2行mail_1和mail_2具有相同的值; clarisse,我想在 mail_2 中分配一个 NULL。所以我在考虑一种算法,首先修复行,然后遍历列并检查当前值是否与前一个值相同。所以最后的 table 会是这样的:

id mail_1 mail_2 mail_3
1 john john_v2 NULL
2 clarisse NULL clarisse_company
3 NULL julie NULL
4 mark markus_91 NULL
5 alfred NULL NULL

用其他语言做这个很容易,比如 Python 或 R,但我想在 SQL 中完成。

有什么想法吗?谢谢

用例

select id,mail_1,
case when mail_1=mail2 then null else mail_2 end as mail_2, mail_3
from table_name

看来你可以使用 NULLIF:

SELECT id,
       Mail1,
       NULLIF(Mail2,Mail1) AS Mail2,
       NULLIF(NULLIF(Mail3,Mail2),Mail1) AS Mail3
FROM dbo.YourTable;

然而,理想情况下,您应该规范化您的设计。不要有 3 个邮件栏,只有一个。如果一个“事物”可以有多个邮件值,那么您需要 2 个具有一对多关系的表。如果2个“事物”也可以有相同的邮件,那么你需要3个表,这样你就可以定义多对多的关系。