MySQL 数据清理
Posted
技术标签:
【中文标题】MySQL 数据清理【英文标题】:MySQL Data Cleansing 【发布时间】:2014-02-17 16:18:17 【问题描述】:我正在尝试清理 mysql 中的一些数据,但我不确定是否是解决以下问题的最有效方法。我有三列 A、B 和 C。它们经常具有相同的值。如果 A & B 相同或 A & C 相同,那么如果可能的话,我想用非 NULL 值填写另一个选项。 B & C 不影响 A 的值。例如:
-------------------
|A |B |C |
-------------------
|1 |2 |3 |
|1 |2 |NULL |
|2 |5 |8 |
|2 |NULL |8 |
|3 |NULL |9 |
|3 |NULL |NULL |
-------------------
在上面的例子中,第2行,C列应该填3,第4行,B列应该填5。当我只有两个选项时,我们相应地填写。因此第 6 行 C 列应为 9,而第 5 行 B 列和第 6 行 B 列都保持 NULL。我如何编写脚本来解决这个问题,如果 B 或 C 不为 NULL,那么我们根据表中的其他值填充它?谢谢。
【问题讨论】:
您可以使用case
编写update
语句。我们非常乐意帮助您编写脚本,但到目前为止您有什么尝试?
【参考方案1】:
这有点复杂,但你可以在一个update
语句中完成:
update table t left outer join
table tc
on t.a = tc.a and t.b = tc.b and tc.c is not null left outer join
table tb
on t.a = tb.a and t.c = tb.c and tb.b is not null
set t.c = coalesce(t.c, tc.c),
t.b = coalesce(t.b, tb.b);
此查询会根据您指定的规则进行自联接以查找新值。每个连接都会带来其中一个值。如果有多个匹配行,则从多行之一中选择任意值。
您可以先运行select
来查看会发生什么:
select *
from table t left outer join
table tc
on t.a = tc.a and t.b = tc.b and tc.c is not null left outer join
table tb
on t.a = tb.a and t.c = tb.c and tb.b is not null;
set c = (case when c is null
then (select c from
【讨论】:
以上是关于MySQL 数据清理的主要内容,如果未能解决你的问题,请参考以下文章