SQL查询:相同ID对应两行数据时优先返回Code非空的记录
查询需求
同一ID对应多条Code值不同的记录时,按以下规则返回结果:
- 若ID下存在Code字段非null的记录,返回Code非空的对应行
- 若ID下不存在Code非空的记录,返回Code为null的行
示例表原始数据如下:
| ID | Code | Name |
|---|---|---|
| 12 | null | Three |
| 12 | 2345 | Three |
| 13 | null | four |
| 14 | 1543 | rewq |
实现方法
通用方案(支持所有带窗口函数的数据库:MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)
核心思路是按ID分组,给组内数据自定义排序优先级:Code非空的行优先级高于Code为null的行,每个分组取优先级最高的第一条即可。
SELECT ID, Code, Name FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY ID ORDER BY CASE WHEN Code IS NOT NULL THEN 0 ELSE 1 END ) AS sort_rn FROM 你的表名 ) tmp WHERE sort_rn = 1;
针对上述示例数据,执行后返回结果为:
| ID | Code | Name |
|---|---|---|
| 12 | 2345 | Three |
| 13 | null | four |
| 14 | 1543 | rewq |
兼容老版本MySQL(5.x版本,不支持窗口函数)
可以通过自关联实现同等逻辑:
SELECT a.* FROM 你的表名 a LEFT JOIN 你的表名 b ON a.ID = b.ID AND b.Code IS NOT NULL WHERE (a.Code IS NOT NULL AND b.ID IS NOT NULL) OR (a.Code IS NULL AND b.ID IS NULL);
逻辑说明:同ID下如果存在非空Code的记录,自关联时会匹配到对应非空行,过滤掉Code为null的冗余行;如果同ID下没有非空Code的记录,关联结果为空,就保留Code为null的行。
内容的提问来源于stack exchange,提问作者nehan
相关产品推荐
相关产品推荐

