MySQL中匹配相同tag_num时填充空列实现列值统一的SQL方案
解决MySQL中同一tag_num下字段空值填充问题
需求说明
当多条记录的tag_num(ID)相同时,需使各列值保持一致:同一tag_num分组内,若某行的description或category字段为空,需用同组内非空的对应字段值填充。
处理前数据
-------------------------------------- | tag_num | description | category | -------------------------------------- | 1 | Description A | A | | 1 | | | | 2 | Description B | B | | 2 | Description B | B | | 2 | Description B | | | 3 | Description C | | | 3 | | | --------------------------------------
预期输出
-------------------------------------- | tag_num | description | category | -------------------------------------- | 1 | Description A | A | | 1 | Description A | A | | 2 | Description B | B | | 2 | Description B | B | | 2 | Description B | B | | 3 | Description C | | | 3 | Description C | | --------------------------------------
解决方案
方案1:查询填充后的结果(不修改原表)
使用窗口函数MAX() OVER (PARTITION BY tag_num)自动忽略NULL值,获取每个tag_num分组内的有效字段值:
SELECT tag_num, MAX(description) OVER (PARTITION BY tag_num) AS description, MAX(category) OVER (PARTITION BY tag_num) AS category FROM your_table;
方案2:直接更新原表中的空值
通过分组子查询获取每个tag_num的有效字段值,再关联原表完成更新:
UPDATE your_table t1 JOIN ( SELECT tag_num, MAX(description) AS desc_val, MAX(category) AS cat_val FROM your_table GROUP BY tag_num ) t2 ON t1.tag_num = t2.tag_num SET t1.description = COALESCE(t1.description, t2.desc_val), t1.category = COALESCE(t1.category, t2.cat_val);
代码说明
- 子查询按
tag_num分组,用MAX()函数提取每个分组内非空的字段值(MAX会自动跳过NULL,保留有效内容) COALESCE()函数用于判断:原字段不为空则保留原值,为空则用分组后的有效值替换
内容的提问来源于stack exchange,提问作者Anna M
相关产品推荐
相关产品推荐

