当前位置: 首页 > news >正文

LISTAGG 用于将多行数据聚合为单行字符串(拼接),而与其功能相反的需求是 将单行字符串按指定分隔符拆分为多行数据

LISTAGG 用于将多行数据聚合为单行字符串(拼接),而与其功能相反的需求是 将单行字符串按指定分隔符拆分为多行数据。Oracle 中没有直接对应的内置内置函数**,但可以通过以下方法实现类似效果:

方法1:使用 CONNECT BY 层级查询(适用于 Oracle 11g+)

通过层级层级查询结合字符串函数(SUBSTRINSTR),将字符串按分隔符拆分多行。

示例:

假设有一个包含拼接字符串的表 DEPT_EMP

DEPTNO EMPLOYEES
10 CLARK,KING,MILLER
20 SMITH,JONES

按逗号拆分 EMPLOYEES 列:

SELECT DEPTNO,TRIM(SUBSTR(',' || EMPLOYEES || ',', LEVEL + 1, INSTR(',' || EMPLOYEES || ',', ',', 1, LEVEL + 1) - LEVEL - 1)) AS EMPLOYEE
FROM DEPT_EMP
CONNECT BY LEVEL <= LENGTH(EMPLOYEES) - LENGTH(REPLACE(EMPLOYEES, ',', '')) + 1  -- 计算分隔符数量,确定行数AND PRIOR DEPTNO = DEPTNO  -- 按分组保持关联AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL;  -- 避免循环(关键)

结果

DEPTNO EMPLOYEE
10 CLARK
10 KING
10 MILLER
20 SMITH
20 JONES

方法2:使用 REGEXP_SUBSTR + 数字序列(适用于 Oracle 11g+)

通过生成数字序列(模拟行数),结合正则表达式 REGEXP_SUBSTR 拆分字符串。

示例:

-- 先生成足够的数字序列(如 1 到 100,可根据实际需求调整)
WITH NUM_SEQ AS (SELECT LEVEL AS NUM FROM DUAL CONNECT BY LEVEL <= 100
)
SELECT DEPTNO,TRIM(REGEXP_SUBSTR(EMPLOYEES, '[^,]+', 1, NUM)) AS EMPLOYEE
FROM DEPT_EMP, NUM_SEQ
WHERE NUM <= LENGTH(EMPLOYEES) - LENGTH(REPLACE(EMPLOYEES, ',', '')) + 1  -- 限制行数为分隔符数量+1
ORDER BY DEPTNO, NUM;

结果同上,此方法更简洁,通过 REGEXP_SUBSTR(字符串, '[^分隔符]+', 1, 序号) 提取第 N 个元素。

方法3:使用 Oracle 12c+ 的 JSON_TABLE(适合复杂场景)

若字符串格式规则,可借助 JSON 函数拆分(将字符串转为 JSON 数组,再解析为行)。

示例:

SELECT DEPTNO,EMPLOYEE
FROM DEPT_EMP,JSON_TABLE('["' || REPLACE(EMPLOYEES, ',', '","') || '"]',  -- 将逗号替换为 JSON 数组格式'$[*]' COLUMNS (EMPLOYEE VARCHAR2(50) PATH '$'));

说明

  • 先将 CLARK,KING 转换为 ["CLARK","KING"](JSON 数组格式),再通过 JSON_TABLE 解析为多行。

总结

Oracle 没有内置的“LISTAGG 反向函数”,但可通过以下方式实现字符串拆分为多行:

  • CONNECT BY + 字符串函数:兼容性好,适用于各版本。
  • REGEXP_SUBSTR + 数字序列:简洁高效,推荐优先使用。
  • JSON_TABLE(12c+):适合处理格式规范的字符串,可读性强。

根据 Oracle 版本和实际场景选择合适的方法即可。

http://www.gsyq.cn/news/50620.html

相关文章:

  • Atcoder FPS 24 记录
  • 扩展单调栈扫描线维护历史信息
  • 酵母单杂交 (Y1H):蛋白质 - DNA 互作研究的 基因解码器
  • ORACLE行记录转字符串用分隔符连接的两个函数:WM_CONCAT、LISTAGG
  • 20232419 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 第三十天
  • WinDbg 随笔 001 —— HelloWorld + WinDbg
  • C++篇(14)二叉树进阶算法题 - 详解
  • 2025年市场上品质好的羊毛地毯制造企业
  • 【STM32工程开源】基于STM32的人体健康监测环境
  • 实用指南:【C# OOP 入门到精通】从基础概念到 MVC 实战(含 SOLID 原则与完整代码)
  • tailwind自定义class问题小记
  • 2025年主流开源AI智能体框架平台概览 - 实践
  • Tarjan复建
  • 20251115
  • 20232307 2024-2025-1 《网络与系统攻防技术》实验五实验报告
  • EXECUTE IMMEDIATE语句分析
  • 产品更新与重构策略:创新与稳定的平衡之道 - 详解
  • Day39(9)F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project01\jdbc-demo+springboot-web-quickstart
  • # Android Compose 实现 左滑删除
  • WebServer类 - 指南
  • EFCore中巧妙利用ToQueryString()实现批插(不借助第三方包)
  • 2025年11月安徽省有实力的旧房翻新企业综合推荐排行榜
  • 2025年Dynamics 365 CRM的工作行情如何?
  • 简单了解数组
  • 2025 最新钢结构厂家推荐排行榜,涵盖全产业链服务与优质产能企业权威甄选钢结构建筑/钢结构房屋/钢结构屋面/钢结构网架/钢结构桁架/钢结构连廊公司推荐
  • 2025 年 11 月漆渣脱水系统,漆渣脱水机,漆渣脱水装置品牌最新推荐,产能、专利、环保三维数据透视!
  • 2025 国内网架厂家最新推荐排行榜:聚焦钢结构 / 球形 / 螺栓球多场景,甄选技术服务双优的权威品牌指南
  • Flink Data Sink 理论 、架构、语义保证、两阶段提交与可插拔拓扑 - 指南
  • 2025年推拉窗源头厂家权威推荐榜单:性价比门窗/系统窗/自建房门窗源头厂家精选