You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询:相同ID对应两行数据时优先返回Code非空的记录

查询需求

同一ID对应多条Code值不同的记录时,按以下规则返回结果:

  • 若ID下存在Code字段非null的记录,返回Code非空的对应行
  • 若ID下不存在Code非空的记录,返回Code为null的行

示例表原始数据如下:

IDCodeName
12nullThree
122345Three
13nullfour
141543rewq
实现方法

通用方案(支持所有带窗口函数的数据库: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;

针对上述示例数据,执行后返回结果为:

IDCodeName
122345Three
13nullfour
141543rewq

兼容老版本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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:09:18