MySQL如何根据AccountId列替换Id列的NULL值?
解决方案:填充同一AccountId下的NULL Id值
核心思路是先获取每个AccountId分组对应的非NULL Id值,再将该组内的NULL Id替换为这个值。以下是不同数据库环境下的可行写法:
支持窗口函数的数据库(MySQL 8.0+、SQL Server、PostgreSQL等)
使用窗口函数MAX() OVER (PARTITION BY AccountId)直接获取当前AccountId组的非NULL Id,再通过COALESCE替换NULL:
SELECT COALESCE(Id, MAX(Id) OVER (PARTITION BY AccountId)) AS Id, AccountId FROM your_table_name;
这里MAX(Id)能准确拿到组内的非NULL Id,因为每个AccountId组只有一个非NULL值,用MIN(Id)效果一样。
旧版本MySQL(不支持窗口函数)
用子查询先分组提取每个AccountId对应的非NULL Id,再关联原表进行替换:
SELECT COALESCE(t1.Id, t2.group_id) AS Id, t1.AccountId FROM your_table_name t1 JOIN ( SELECT AccountId, MAX(Id) AS group_id FROM your_table_name GROUP BY AccountId ) t2 ON t1.AccountId = t2.AccountId;
为什么之前的IF()/COALESCE()没生效?
你之前应该是直接写了COALESCE(Id, AccountId),没有关联到同组的非NULL Id值,所以才会把NULL替换成AccountId。上面的写法是先拿到对应分组的正确Id,再做替换。
执行后得到的目标结果:
| Id | AccountId |
|---|---|
| 201 | a-123 |
| 201 | a-123 |
| 201 | a-123 |
| 202 | a-234 |
| 203 | a-345 |
内容的提问来源于stack exchange,提问作者t-Dawg
相关产品推荐
相关产品推荐

