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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:03:15