将 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个表,这样你就可以定义多对多的关系。
我有一个 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个表,这样你就可以定义多对多的关系。