当前位置: 首页 > 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.jsqmd.com/news/41289/

相关文章:

  • ESP32 I2S音频总线学习笔记(八):添加按键控制功能 - 详解
  • 2025年8款AI论文写作神器推荐:轻松搞定毕业论文查重
  • 基于python的酒店管理系统_36rhk752(Pycharm Flask Django成品源码LW) - 详解
  • pythontip 从字典中删除一组键
  • Softmax 函数全面而详细的解读,原理、图像、应用 - 详解
  • 中级前端工程师详细技能清单
  • Atcoder FPS 24 记录
  • 扩展单调栈扫描线维护历史信息
  • 酵母单杂交 (Y1H):蛋白质 - DNA 互作研究的 基因解码器
  • ORACLE行记录转字符串用分隔符连接的两个函数:WM_CONCAT、LISTAGG
  • MySQL 8+ 日志管理与数据备份恢复实战指南 - 指南
  • 航运、应急、工业适用,AORO P1100三防平板引领行业数字化变革 - 详解
  • 20232419 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 为什么高手写 CSS 都偏爱 rem?这三大优势无法拒绝
  • 完整教程:FPGA 49 ,Xilinx Vivado 软件术语解析(Vivado 界面常用英文字段详解,以及实际应用场景和注意事项 )
  • 前端css中rem的作用
  • 第三十天
  • WinDbg 随笔 001 —— HelloWorld + WinDbg
  • 数据结构2:单链表 - 教程
  • 20251115 - Hash 总结
  • BZOJ2372 music
  • P11664 [JOI 2025 Final] 缆车 / Mi Telefrico
  • WPF中RelayCommand的完成与使用详解
  • C++篇(14)二叉树进阶算法题 - 详解
  • Python 潮流周刊#127:Python 3.16 JIT 性能提升计划
  • 非线性序列密码结构
  • 2025/11/15
  • LoongOS 上传文件
  • 基础设施即服务(IaaS)全面解析:云计算的基石
  • CentOS 7 通过 Packstack 安装 OpenStack Train 完整步骤