如何在PostgreSQL中使用OR函数聚合元组得到目标结果?
使用OR聚合逻辑合并数据的实现方案
原始数据
COL_1 | COL_2 | COL_3 val | Abc | Null val | Null | CDe
目标结果
COL_1 | COL_2 | COL_3 val | Abc | CDe
你要实现的是按COL_1分组,对COL_2和COL_3应用OR逻辑聚合——即同一分组内,只要存在非空值就保留该值(Null在逻辑判断中等价于假,OR操作会取存在的真值)。以下是不同SQL数据库的具体实现方式:
通用兼容方案(适用于多数数据库)
利用MAX()或MIN()聚合函数,非空字符串的排序优先级高于Null,分组后会自动保留非空值,效果与OR逻辑一致:
SELECT COL_1, MAX(COL_2) AS COL_2, MAX(COL_3) AS COL_3 FROM your_table GROUP BY COL_1;
针对特定数据库的优化方案
- PostgreSQL:使用窗口函数
FIRST_VALUE优先选取非空值:
SELECT DISTINCT COL_1, FIRST_VALUE(COL_2) OVER (PARTITION BY COL_1 ORDER BY CASE WHEN COL_2 IS NOT NULL THEN 0 ELSE 1 END) AS COL_2, FIRST_VALUE(COL_3) OVER (PARTITION BY COL_1 ORDER BY CASE WHEN COL_3 IS NOT NULL THEN 0 ELSE 1 END) AS COL_3 FROM your_table;
- MySQL:通过
GROUP_CONCAT过滤Null后提取首个非空值:
SELECT COL_1, SUBSTRING_INDEX(GROUP_CONCAT(COL_2 SEPARATOR ''), '', 1) AS COL_2, SUBSTRING_INDEX(GROUP_CONCAT(COL_3 SEPARATOR ''), '', 1) AS COL_3 FROM your_table GROUP BY COL_1;
核心逻辑说明
你的需求本质是分组内保留各列的唯一非空值,同一分组中每个列仅存在一个非空值,因此任何能筛选出分组内非空值的函数都能实现该效果,上述方案均围绕此逻辑展开。
内容的提问来源于stack exchange,提问作者Riya Bansal
相关产品推荐
相关产品推荐

