同数据集无需关联表按相同邮箱匹配填充缺失值的实现方法
实现方案
场景1:仅需查询输出,不修改原表
直接用窗口函数按邮箱分组取有效姓名即可,空字符串会被聚合逻辑自动忽略:
SELECT email, -- NULLIF用于把空字符串转为NULL,避免被聚合统计 MAX(NULLIF(name, '')) OVER (PARTITION BY email) AS name FROM 你的表名;
如果同一个邮箱下存在多个不同的非空姓名,可将MAX替换为MIN,或用FIRST_VALUE配合排序规则取你需要的特定姓名。
场景2:需要直接更新原表的空姓名
MySQL 写法
UPDATE 你的表名 t1 JOIN ( -- 先预查询每个邮箱对应的有效姓名 SELECT email, MAX(name) AS valid_name FROM 你的表名 WHERE name != '' GROUP BY email ) t2 ON t1.email = t2.email -- 只更新姓名为空的行 SET t1.name = t2.valid_name WHERE t1.name = '';
PostgreSQL/Oracle 写法
UPDATE 你的表名 t1 SET name = t2.valid_name FROM ( SELECT email, MAX(name) AS valid_name FROM 你的表名 WHERE name != '' GROUP BY email ) t2 WHERE t1.email = t2.email AND t1.name = '';
IFNULL 适配写法
如果要按你预期的IFNULL实现,可配合相关子查询使用,性能略低于窗口函数方案:
SELECT email, IFNULL( NULLIF(name, ''), (SELECT MAX(name) FROM 你的表名 t2 WHERE t2.email = t1.email AND t2.name != '') ) AS name FROM 你的表名 t1;
内容的提问来源于stack exchange,提问作者Mr. Jibz
相关产品推荐
相关产品推荐

