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

GBase 8a之listagg/string_agg 函数的反函数实现

GBase8a数据库中 listagg/string_agg 函数的反函数实现一、业务场景背景在日常数据开发中我们经常会遇到这种场景某张表的字段里存储了用逗号或其他分隔符拼接的多个值比如商品分类、标签、关联系统名称等业务上需要把这些逗号分隔的字符串拆分成多行数据方便后续的统计分析、关联查询或ETL处理。这就是我们常说的“字符串拆分”也被称为listagg/string_agg的“反函数”操作。不同数据库生态下实现方案差异较大•Oracle 中常用 CONNECT BY 层级查询配合正则实现拆分•GBase 8a MPP 这类国产数据库也支持类似的层级查询语法•但在部分环境中层级查询语法存在兼容性限制或在数据量较大时性能不够稳定这时候就需要更通用、可移植的实现方案。二、问题分析与通用方案选型1. 原方案层级查询法的局限性你最开始使用的 Oracle/GBase 层级查询方案核心逻辑是通过 CONNECT BY LEVEL 生成序列再用 regexp_substr 按位置截取字符串SELECT id, regexp_substr(names, [^,], 1, LEVEL) AS name FROM t_demo WHERE names IS NOT NULL CONNECT BY PRIOR id id AND PRIOR rand() IS NOT null AND LEVEL length(names) - length(replace(names, ,, )) 1;这种方案在小数据量下能快速实现需求但存在几个明显的短板•兼容性差依赖数据库的层级查询和正则扩展函数无法直接迁移到不支持该语法的数据库•性能瓶颈当单条记录的分隔项数量极多比如上千个时层级查询会产生大量递归操作执行效率下降明显•特殊字符风险原方案对中文逗号、全角符号等分隔符的处理不够友好容易出现拆分失败的情况。2. 通用方案数字辅助表法我们最终选择的“数字辅助表关联拆分”方案是一种几乎兼容所有关系型数据库的通用实现核心思路是•先创建一个存储连续整数的“数字辅助表”numbers生成从1到N的序列•用辅助表的数字和原表做关联关联条件为“数字 ≤ 分隔符数量1”也就是拆分后的行数•通过两次 SUBSTRING_INDEX 函数按位置截取第N个分隔项•统一分隔符格式兼容全角逗号、半角逗号等不同写法。这种方案的优势在于•兼容性极强不依赖任何数据库的特殊语法MySQL、GBase、PostgreSQL 等主流数据库都支持•性能稳定基于普通的表关联实现执行计划清晰大数据量下的表现远优于层级递归•扩展性强可以轻松适配不同分隔符逗号、分号、竖线等也支持处理全角/半角混合的场景。三、完整实现步骤下面我们一步步实现这个通用的字符串拆分方案。步骤1创建测试表与初始化数据 先创建一张测试表模拟业务中常见的场景同时包含半角逗号、全角逗号两种分隔符 SQL -- 先删除旧表避免报错 DROP TABLE IF EXISTS t_demo; CREATE TABLE t_demo ( id INT , names VARCHAR(255) ); -- 插入测试数据包含全角逗号、半角逗号两种分隔符 INSERT INTO t_demo VALUES (101, 苹果香蕉橙子), -- 全角逗号分隔 (102, 电脑手机), -- 全角逗号分隔 (103, GBase,MySQL,Oracle,SQLServer); -- 半角逗号分隔 步骤2创建数字辅助表并初始化数据 数字辅助表是整个方案的核心我们通过存储过程批量生成连续整数方便后续使用 SQL -- 删除旧的辅助表 DROP TABLE IF EXISTS numbers; -- 创建数字辅助表存储从1开始的连续整数 CREATE TABLE numbers ( n INT ); -- 如果存储过程已存在先删除 DROP PROCEDURE IF EXISTS InsertNumbers; -- 修改语句结束符避免存储过程内部的分号和外部冲突 DELIMITER $$ CREATE PROCEDURE InsertNumbers(IN max_num INT) BEGIN DECLARE i INT DEFAULT 1; -- 清空辅助表数据 TRUNCATE TABLE numbers; -- 处理异常参数如果传入的max_num为空或小于1默认生成100条数据 IF max_num IS NULL OR max_num 1 THEN SET max_num 100; END IF; -- 循环插入从1到max_num的连续整数 WHILE i max_num DO INSERT INTO numbers (n) VALUES (i); SET i i 1; END WHILE; END$$ DELIMITER ; -- 调用存储过程生成1-100的数字序列 CALL InsertNumbers(100); 说明max_num 的取值建议设置为业务中“单条记录最大分隔项数量”的上限比如你的业务中最多单条记录有50个标签设置为100就完全够用了。 步骤3核心拆分SQL实现 通过子查询统一分隔符再关联数字辅助表完成字符串拆分 SQL SELECT t.id, -- 两次SUBSTRING_INDEX截取第n个分隔项再用TRIM去除首尾空格 TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(unified_names, ,, n.n), ,, -1)) AS name FROM ( -- 子查询先把所有全角逗号替换为半角逗号统一分隔符格式 SELECT id, REPLACE(names, , ,) AS unified_names FROM t_demo WHERE names IS NOT NULL ) t -- 关联数字辅助表关联条件为n不超过拆分后的总行数 JOIN numbers n ON n.n LENGTH(t.unified_names) - LENGTH(REPLACE(t.unified_names, ,, )) 1 -- 按原表id和拆分顺序排序结果更易读 ORDER BY t.id, n.n; gbase SELECT - t.id, - TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(unified_names, ,, n.n), ,, -1)) AS name - FROM ( - SELECT - id, - REPLACE(names, , ,) AS unified_names - FROM t_demo - WHERE names IS NOT NULL - ) t - JOIN numbers n - ON n.n LENGTH(t.unified_names) - LENGTH(REPLACE(t.unified_names, ,, )) 1 - ORDER BY t.id, n.n; ----------------- | id | name | ----------------- | 101 | 苹果 | | 101 | 香蕉 | | 101 | 橙子 | | 102 | 电脑 | | 102 | 手机 | | 103 | GBase | | 103 | MySQL | | 103 | Oracle | | 103 | SQLServer | ----------------- 9 rows in set (Elapsed: 00:00:00.12)可以看到所有逗号分隔的字符串都被拆分成了独立的行全角/半角逗号也被统一处理拆分结果完全符合预期。四、核心原理详解1. 分隔符统一处理REPLACE(names, , ,) 这一步是为了处理全角逗号和半角逗号混用的场景把所有全角逗号替换为半角逗号避免因为分隔符格式不统一导致拆分失败。2. 计算拆分后的总行数LENGTH(t.unified_names) - LENGTH(REPLACE(t.unified_names, ,, )) 1 这个公式是计算单条记录需要拆分成多少行•原字符串长度LENGTH(unified_names)•去掉所有逗号后的字符串长度LENGTH(REPLACE(unified_names, ,, ))•两者的差值就是字符串中逗号的数量•逗号数量 1就是拆分后的总行数比如a,b,c有2个逗号拆分后是3行。3. 两次 SUBSTRING_INDEX 截取SUBSTRING_INDEX(str, delim, count) 函数的作用是按分隔符截取字符串•SUBSTRING_INDEX(unified_names, ,, n.n)截取字符串的前n.n个分隔项比如n2时GBase,MySQL,Oracle会被截取为GBase,MySQL•再用 SUBSTRING_INDEX(..., ,, -1)从截取后的字符串中取最后一个分隔项也就是MySQL•最后用 TRIM() 去除可能存在的首尾空格得到干净的结果。

相关文章:

GBase 8a之listagg/string_agg 函数的反函数实现

GBase8a数据库中 listagg/string_agg 函数的反函数实现一、业务场景背景 在日常数据开发中,我们经常会遇到这种场景:某张表的字段里存储了用逗号(或其他分隔符)拼接的多个值,比如商品分类、标签、关联系统名称等&#…...

GBase 8a数据库实际支持的索引类型详解

本文继续说明为什么列存不依赖传统 B-Tree 索引,南大通用GBase 8a数据库(gbase database) 实际使用了哪些替代机制,以及怎样在列存环境下做到真正有效的查询加速。虽然传统 B-Tree 索引在列存引擎上效果有限,GBase 8a数据库仍然支…...

物理标签退场,视觉原生上位:UWB vs 镜像视界无感定位・空间智能重构

物理标签退场,视觉原生上位:UWB vs 镜像视界无感定位・空间智能重构在空间智能加速重构物理世界的当下,全域感知技术正经历一场从“物理标签”到“视觉原生”的底层范式革命。长期以来,以UWB(超宽带)为代表…...

3个核心操作:让网络架构可视化变得如此简单

3个核心操作:让网络架构可视化变得如此简单 【免费下载链接】easy-topo vuesvgelement-ui 快捷画出网络拓扑图 项目地址: https://gitcode.com/gh_mirrors/ea/easy-topo 在数字时代的网络管理中,技术文档的可视化呈现已经成为专业沟通的关键。面对…...

[智能体-7]:业务数据序列化为 JSON 字符串 完整示例

一、概念序列化:把程序里的对象 / 字典 / 实体数据 → 转换成JSON 格式字符串,用于网络传输、接口请求、存储。反序列化:JSON 字符串 → 还原成程序可直接使用的数据对象。二、Python 示例(最常用,对接 OpenAI / 大模型…...

标准化封装国产电源:钡特电源 VB50-24S24LD 与金升阳 URB2424LD-50WR3 同属工业高可靠

在工业电子系统设计中,工业 DC-DC 电源模块作为核心供电单元,其标准化程度、稳定性及适配性直接影响设备整体可靠性与研发效率。钡特电源 VB50-24S24LD 与金升阳 URB2424LD-50WR3 作为 50W 级国产工业 DC-DC 代表产品,均采用国际标准封装引脚…...

【独家首发】ElevenLabs未公开的缅甸文字母映射表+音节切分规则(含Unicode 15.1适配清单)

更多请点击: https://codechina.net 第一章:ElevenLabs缅甸文语音支持的底层架构概览 ElevenLabs 对缅甸文(Burmese, my-MM)的语音合成支持并非简单添加语言标签,而是依托其端到端神经语音建模栈完成深度适配。其核心…...

5个核心技术:深度掌握Sollumz在GTA V建模中的架构设计与实战应用

5个核心技术:深度掌握Sollumz在GTA V建模中的架构设计与实战应用 【免费下载链接】Sollumz Grand Theft Auto V modding suite for Blender. This add-on allows the creation of modded game assets: 3D models, maps, interiors, animations, etc. 项目地址: ht…...

Midjourney新艺术风格突然失效?92%用户忽略的--stylize冲突机制与3步回滚修复法

更多请点击: https://codechina.net 第一章:Midjourney新艺术风格突然失效?92%用户忽略的--stylize冲突机制与3步回滚修复法 近期大量用户反馈:在 Midjourney v6.1 中启用高 stylize 值(如 --stylize 1000&#xff0…...

用户分享 + 消费排队福利模式合规落地指南:5 大实体行业通用方案

注:本文所有数据为单门店经营案例参考,不代表所有门店的经营收益,实际效果受多种因素影响一、多数社区门店的经营困境:营销预算有限,获客留客难度大不少社区夫妻店的经营者,都会遇到类似的经营难题&#xf…...

实体门店低获客成本增长案例:3 人转介绍模型 + 消费返还机制落地分析

一、案例背景该门店为 60㎡社区夫妻店,位于成熟居住商圈,周边覆盖 3 个社区共 3000 余户居民。此前门店采用传统公域投放 线下发单的获客模式,获客成本偏高,用户留存与老客转介绍率存在较大提升空间。二、核心运营方案设计本次方…...

摆脱论文困扰!!2026 最新降AIGC软件测评与推荐

2026年真正好用的AI论文降重与改写工具,核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...

技术突破:如何让ARM设备突破x86架构的束缚?

技术突破:如何让ARM设备突破x86架构的束缚? 【免费下载链接】box64 Box64 - Linux Userspace x86_64 Emulator with a twist, targeted at ARM64, RV64 and LoongArch Linux devices 项目地址: https://gitcode.com/gh_mirrors/bo/box64 你是否曾…...

6款优质降AIGC平台 降痕效果拉满

写论文时不断攀升的AIGC率让人焦虑不已?别担心,这里整理了6款高效实用的降AIGC工具,堪称应对AI痕迹问题的"得力助手"。它们能有效识别并消除AI生成特征,降痕能力出众,助你轻松通过查重审核,彻底摆…...

Captain AI:Ozon售后全流程智能化,降低损失,提升复购

售后运营是Ozon店铺稳定发展的关键,优质的售后体验能提升买家复购率、维护店铺口碑,而国内商家在售后运营中,常常面临“时差响应慢、纠纷处理不专业、退换货流程繁琐”的问题,导致买家差评增加、店铺权重下降,甚至产生…...

智能驾驶系统场景下的自动化仿真测试评价技术【附仿真】

✨ 长期致力于智能驾驶系统、有效性评价、测试用例生成、测试场景优化、自动化仿真测试平台研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于复杂度…...

3分钟完成Excel批量查询:智能多文件搜索工具完整指南

3分钟完成Excel批量查询:智能多文件搜索工具完整指南 【免费下载链接】QueryExcel 多Excel文件内容查询工具。 项目地址: https://gitcode.com/gh_mirrors/qu/QueryExcel 还在为处理海量Excel文件而烦恼吗?面对成百上千个表格文件,传统…...

Captain AI:Ozon俄文内容本地化,打破语言壁垒,贴合本土需求

俄文内容本地化是Ozon商家立足俄罗斯市场的核心前提,Ozon平台95%以上的用户为俄语母语者,纯中文或机翻的内容不仅会导致搜索曝光降低,还可能因语言错误引发合规风险、影响买家信任。然而,国内商家普遍面临“俄语专业人才短缺、机翻…...

使用电脑快速测试 PROFINET 设备通讯

Anybus PROFINET主站仿真工具介绍日常对客户进行技术支持的时候,我们发现工厂自动化领域的不同部门不同职能的人员对于工业通讯设备都面临着一些使用的困难,例如设备研发人员,尤其是嵌入式研发部门,对于工厂自动化使用的工业通讯协…...

Stable Diffusion 实战教程:从安装到图像生成

Stable Diffusion 实战教程:从安装到图像生成 前言 Stable Diffusion 是当前最流行的开源图像生成模型之一。它能够根据文字描述生成高质量的图像,在创意设计、游戏开发等领域有广泛应用。 我在多个项目中使用过 Stable Diffusion,从简单的图…...

多模态大模型技术入门:让 AI 看见世界

多模态大模型技术入门:让 AI 看见世界 前言 人类感知世界的方式是多模态的——我们能看到图像、听到声音、读到文字。多模态大模型(Multimodal LLM)正是让 AI 拥有类似能力的关键技术。从 GPT-4V 到 Claude 3,从开源的 LLaVA 到 C…...

“--tile”失效了?深度逆向Midjourney纹理无缝拼接底层逻辑(含Python自动化Tile校验脚本)

更多请点击: https://codechina.net 第一章:Midjourney纹理无缝拼接的核心价值与失效现象洞察 在游戏开发、建筑可视化与数字孪生等高频复用表面材质的场景中,Midjourney生成的纹理若能实现像素级无缝拼接(tiling)&am…...

技术人的人际关系:建立良好的职业网络

技术人的人际关系:建立良好的职业网络 引言 作为一名技术人,人际关系同样重要。良好的人际关系可以帮助我们获得更多机会,提升职业发展。 今天就来分享一下如何建立良好的职业网络。 为什么人际关系重要 职业发展 良好的人际关系有助于职业发…...

LangFuse与LangSmith区别

文章目录🔄 **核心定位对比**🎯 **适用场景差异**💡 **为什么两者并存?**🔄 核心定位对比 LangSmith(LangChain官方): 闭源产品,由LangChain官方提供深度集成&#xff…...

Belkin向范围3排放碳中和目标迈进

该公司发布的《2025年环境影响报告》重点介绍了其在减排、循环设计和负责任包装方面取得的持续进展 发布了《2025年环境影响报告》(2025 Impact Report),重点介绍了关键成就,并重申了其对企业社会责任的承诺。在2025年实现范围1和…...

数字图像质量提升技术【附代码】

✨ 长期致力于图像质量提升、计算机图形处理器、并行加速、非均匀校正、图像超分辨、反射光消除、深度学习、生成对抗网络研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 &#…...

涡流检测驱动的发动机气门硬度分选技术【附算法】

✨ 长期致力于核环境机器人、机器人运动学、机械臂振动抑制、自适应动力学控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)核辐射环境下涡流检测机…...

大规模数据降维中迹比率问题与非负矩阵分解的快速算法【附代码】

✨ 长期致力于数据降维、大规模判别分析、迹比率问题、快速算法、非负矩阵分解研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)随机迹比率问题的显式解…...

计算机视觉与深度学习融合的群养猪行为识别与分类算法【附算法】

✨ 长期致力于计算机视觉、深度学习、攻击识别、多物体玩耍识别、饮水和玩耍饮水器分类、进食识别、行为量化研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1&…...

RAG 和 NotebookLM 都试过后,我才发现数据库知识库真正缺的不是搜索

很多数据库知识库不好用,不是模型不会答,而是知识没有被整理成可调用、可校验、可维护的资产。 前面几篇一直在聊 DB Agent。 聊 Skill,聊记忆,聊告警风暴,聊编排,也聊到了系统画像、历史案例和当前证据。…...