讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在PostgreSQL 16中使用STRING_AGG函数进行多行数据合并?

陌宇吖_9414

陌宇吖_9414

发布时间:2026-06-28 07:36:34

|

857人浏览过

|

来源于php中文网

原创

STRING_AGG在PostgreSQL 16中仍要求严格参数顺序(expression, delimiter),不支持NULL分隔符,必须显式ORDER BY保证顺序,GROUP BY字段须完整匹配非聚合列,NULL值默认跳过但空字符串参与拼接。

如何在postgresql 16中使用string_agg函数进行多行数据合并?

STRING_AGG 在 PostgreSQL 16 中行为与之前版本基本一致,但需注意几个关键点:它仍是唯一原生支持排序、去重和 NULL 控制的字符串聚合函数,不依赖扩展,也不受 GROUP_CONCAT(MySQL)或 FOR XML PATH(SQL Server)等语法干扰。

参数顺序写错会直接报错

必须是 STRING_AGG(expression, delimiter),不能颠倒。常见错误是把分隔符放前面:STRING_AGG(', ', col) —— 这会导致 PostgreSQL 报错:function string_agg(unknown, text) does not exist,因为类型推导失败。

如果 expression 是非文本类型(比如 integer 或 uuid),必须显式转换:STRING_AGG(CAST(id AS TEXT), ', ');否则会报类型不匹配错误。

  • 分隔符可以是任意字符串,包括空字符串 ''(无间隔拼接)
  • 若 delimiter 为 NULL,整个结果变为 NULL,不是跳过分隔符
  • 支持嵌套表达式,如 STRING_AGG(COALESCE(name, 'unnamed'), ' | ')

不加 ORDER BY 时顺序不可靠

PostgreSQL 不保证未指定排序的拼接顺序。同一查询多次执行,可能返回 "A, B, C" 或 "C, A, B" —— 这取决于底层执行计划,而非插入顺序或主键顺序。

正确写法是把 ORDER BY 放在括号内、分隔符之后:STRING_AGG(tag, ', ' ORDER BY created_at DESC)。

PostgreSQL 18.4 ubuntu
PostgreSQL 18.4 ubuntu

PostgreSQL 18.4 官方 Ubuntu 安装包现已发布,这是目前最新的稳定版本。推荐通过官方 APT 仓库安装:先执行 sudo apt update 更新索引,再运行 sudo apt install postgresql-18 即可完成部署。新版本引入了异步 I/O 子系统,在顺序扫描与 VACUUM 场景下性能提升显著,同时支持 UUID v7 原生生成函数与虚拟生成列。

下载
  • 支持多字段排序:ORDER BY status NULLS LAST, updated_at DESC
  • NULLS FIRST / NULLS LAST 必须显式声明,否则默认 NULLS FIRST
  • 排序字段若来自 JOIN 表,需确保别名或前缀明确,避免歧义

GROUP BY 漏写或字段不匹配导致数据错乱

这是线上最常引发数据事故的原因:想按 user_id 合并标签,却忘了 GROUP BY user_id,或者误用了 username(存在重名)。

检查规则很简单:SELECT 列表中所有非聚合字段,必须完整出现在 GROUP BY 子句里,且不能用 SELECT 中定义的别名(如 AS uid)参与 GROUP BY,应写原始列名或表前缀:GROUP BY t.user_id。

  • 若聚合字段含重复值且需去重,可用 STRING_AGG(DISTINCT tag, ', '),但仅限单字段;多字段去重要先用 DISTINCT ON 或 CTE 预处理
  • 聚合后字符串超长?PostgreSQL 16 默认无硬限制,但客户端或应用层可能截断;必要时用 SUBSTRING(STRING_AGG(...), 1, 1000) 控制长度

NULL 值默认被跳过,但需主动控制逻辑

STRING_AGG 默认忽略 NULL 值,这通常合理;但它不会把 NULL 替换成空字符串 —— 如果你希望显示占位符,得用 COALESCE 或 CASE WHEN 预处理:

STRING_AGG(CASE WHEN name IS NULL THEN '[missing]' ELSE name END, ', ')

  • 空字符串 '' 不会被跳过,会参与拼接,例如 'a, ,c'
  • 若整组全是 NULL,结果为 NULL(不是空字符串)
  • 性能上,STRING_AGG 是 C 实现,比应用层循环快 3–5 倍;但大数据量下仍建议加索引覆盖排序字段
实际中最容易被忽略的是:**排序子句必须紧贴分隔符之后、括号之内,且不能放在 GROUP BY 外面**。写成 STRING_AGG(tag, ', ') ORDER BY tag 是语法错误 —— 这个 ORDER BY 属于窗口函数或外层查询,对聚合结果无效。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4189

2023.11.02

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。更详细的postgresql常用命令,大家可以访问下面的文章。

627

2023.11.16

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有l、d、d5、di、ds、dv、df、dn、db、dg、dp、c、pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

1376

2023.11.20

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

440

2026.02.12

PostgreSQL 性能优化与查询执行计划实战
PostgreSQL 性能优化与查询执行计划实战

本专题深入解析PostgreSQL性能优化核心,聚焦查询执行计划的实战应用。通过EXPLAIN命令精准定位瓶颈,结合索引策略、SQL改写与参数调优,系统提升查询效率。从执行计划解读到性能调优全流程,助你掌握数据库性能诊断与优化实战能力。

130

2026.05.08

PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践
PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践

本文详解如何利用Next.js(搭配Drizzle ORM)与Go后端构建高性能应用,充分发挥PG在JSONB非结构化存储与pgvector向量检索上的优势。从数据建模到Docker容器化部署,打造支持AI时代的“One Database”工程化解决方案。

881

2026.05.08

PostgreSQL高级特性、内核机制与现代数据架构
PostgreSQL高级特性、内核机制与现代数据架构

本专题从MVCC并发控制与WAL日志等内核机制出发,详解JSONB、PostGIS及pgvector等高级特性。探讨如何利用单一引擎支撑关系型、向量及图数据等现代数据架构需求,助您掌握构建高并发、智能化应用的核心技术。

224

2026.05.08

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

0

2026.09.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 176人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 20.2万人学习

PostgreSQL 手册
PostgreSQL 手册

共0课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn