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

news/2025/11/15 20:37:44/文章来源:https://www.cnblogs.com/yclizq/p/19226215

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.mzph.cn/news/966492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP32 I2S音频总线学习笔记(八):添加按键控制功能 - 详解

ESP32 I2S音频总线学习笔记(八):添加按键控制功能 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

2025年8款AI论文写作神器推荐:轻松搞定毕业论文查重

2025 年毕业论文仍是学子难题,导师强调其重要性让同学们压力倍增。从选题到应对查重,每一步都困难重重。不过,科技发展带来新希望,AI 技术可提高写作效率。文章推荐了 2025 年 8 款 AI 论文写作神器,如 PaperNex、…

基于python的酒店管理系统_36rhk752(Pycharm Flask Django成品源码LW) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

pythontip 从字典中删除一组键

编写一个程序,使用提供的键列表从字典中删除指定的键集合。 定义函数remove_keys(),有两个参数:字典dict_input和键列表key_list。 在函数中,从字典中删除key_list中存在的所有键。 返回更新后的字典。 示例输入 {…

Softmax 函数全面而详细的解读,原理、图像、应用 - 详解

Softmax 函数全面而详细的解读,原理、图像、应用 - 详解2025-11-15 20:18 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important;…

中级前端工程师详细技能清单

一、JavaScript:超越语法,深入核心技能领域具体技能点中级要求与深度理解语言核心 作用域与闭包 能解释清楚词法作用域,能使用闭包解决实际问题(如模块模式、数据私有化),能避免常见的内存泄漏问题。 原型与原型…

Atcoder FPS 24 记录

awa A 记 \(f_{i,j}\) 表示前 \(i\) 天花了 \(j\) 块的方案,有转移 \(f_{i,j}=f_{i-1,j-1}+f_{i-1,j-3}+f_{i-1,j-4}+f_{i-1,j-6}\),边界是 \(f_{0,0}=1\)。 把 \(f_i\) 的生成函数写出来,也就是 \(F_i(x)=\sum\lim…

扩展单调栈扫描线维护历史信息

扩展单调栈&扫描线维护历史信息同样来自模拟赛 T4。引入 考虑如下问题: 给定一个初始为空的数列 \(a\),有 \(c\) 次操作,每次操作形如:\(1\) \(x\):将值 \(x\) 放入 \(a\) 的末尾。(保证这个操作有 \(n\) 次…

酵母单杂交 (Y1H):蛋白质 - DNA 互作研究的 基因解码器

酵母单杂交 (Y1H) 是一种研究蛋白质与 DNA 相互作用的经典分子生物学技术,基于转录因子的结构特性,通过报告基因表达检测实现蛋白质 - DNA 互作的高通量分析,广泛应用于基因调控网络解析和转录因子鉴定。 一、核心原…

ORACLE行记录转字符串用分隔符连接的两个函数:WM_CONCAT、LISTAGG

WM_CONCAT 是 Oracle 数据库中一个非官方的聚合函数(属于 Oracle 内部函数,未正式文档正式支持),用于将多行数据的某一列值拼接成一个字符串,通常用逗号分隔。 基本语法 WM_CONCAT(列名)作用:将分组内指定列的多…

MySQL 8+ 日志管理与数据备份恢复实战指南 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

航运、应急、工业适用,AORO P1100三防平板引领行业数字化变革 - 详解

航运、应急、工业适用,AORO P1100三防平板引领行业数字化变革 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &q…

20232419 2025-2026-1 《网络与系统攻防技术》实验五实验报告

1实验内容 1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息: DNS注册人及联系方式 该域名对应IP地址 IP地址注册人及联系方式 IP地址所在国家、城市和具体地理位置 PS:使用w…

为什么高手写 CSS 都偏爱 rem?这三大优势无法拒绝

核心概念:rem 是什么?rem 的全称是 root em。em 是相对于其父元素的字体大小。rem 是相对于根元素(<html>)的字体大小。、默认情况下,几乎所有浏览器的根元素字体大小都是 16px。所以,在未做任何修改时:1…

完整教程:FPGA 49 ,Xilinx Vivado 软件术语解析(Vivado 界面常用英文字段详解,以及实际应用场景和注意事项 )

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

前端css中rem的作用

核心概念:rem 是什么?rem 的全称是 root em。em 是相对于其父元素的字体大小。rem 是相对于根元素(<html>)的字体大小。、默认情况下,几乎所有浏览器的根元素字体大小都是 16px。所以,在未做任何修改时:1…

第三十天

今天的学习重心放在了Java Web开发的核心实践上,围绕石家庄铁道大学选课管理系统的功能迭代展开,收获比预期更扎实。 上午先梳理了项目的分层架构逻辑,重点巩固了Controller、Service、Dao三层的职责划分——Contro…

WinDbg 随笔 001 —— HelloWorld + WinDbg

声明:个人笔记,概不负责 今天搞出个 C 程序,连 main 都进不了,WinDbg 也没办法断,无奈只能架起 宇宙第一的 Visual Studio 写个 HelloWorld 对比一下差异。 这 WinDbg 断 HelloWorld 我搞过好多回了,每次都随机抛…

数据结构2:单链表 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

20251115 - Hash 总结

你说得对,但我几乎从来不把哈希叫做哈希,我习惯了叫 Hash。 比赛链接:https://vjudge.net/contest/766880。 卡 Hash 的出题人都是毒瘤出题人喵!一点也不良心。 A - Barn Echoes G 由于这个长度只有 \(80\),因此随…