SQL拆分字段内容(含分隔符)

问题描述:

在做数据迁移的过程中,我们希望对表中的某个字段根据分隔符进行拆分,得到多条数据,原代码有点意思,因此记录一下。
我们假设某条数据如下:

IDSTR
S1公司名称不能小于四个字,行业类别不能为空,职务/岗位不能为空,公司电话不能小于8位且真是有效

针对这条数据,我们希望将其拆分成为四份或者五份,以便于后续的数据处理(这里是拆成四份,加上原来的那条数据一共是五条)。
希望得到的结果:
STEP1:

IDSTR
S1公司名称不能小于四个字,行业类别不能为空,职务/岗位不能为空,公司电话不能小于8位且真是有效
S1公司名称不能小于四个字,行业类别不能为空,职务/岗位不能为空,公司电话不能小于8位且真是有效
S1公司名称不能小于四个字,行业类别不能为空,职务/岗位不能为空,公司电话不能小于8位且真是有效
S1公司名称不能小于四个字,行业类别不能为空,职务/岗位不能为空,公司电话不能小于8位且真是有效
S1公司名称不能小于四个字,行业类别不能为空,职务/岗位不能为空,公司电话不能小于8位且真是有效

原作者最后希望得到如下的数据:
STEP2:

IDSTR
S1公司名称不能小于四个字,
S1行业类别不能为空,
S1职务/岗位不能为空,
S1公司电话不能小于8位且真是有效

DB2原代码

针对STEP1:
原来的代码:

WITH N (STR,ORI,POS,ID) AS 
(
(SELECT CONCAT(STR,','),1,POSSER(CONCAT(STR,','),','),IDFROM TABLE_NAMEWHERE ID = 'S1')UNION ALLSELECT STR,POS+1,LOCATE(',',STR,POS+1),STRFROM N WHERE LOCATE(',',STR,POS+1)+1>0)SELECT * FROM N 

结果如下:

STRORIPOSID
公司名称不能小于四个字,行业类别不能为空,职务/岗位不能为空,公司电话不能小于8位且真是有效122S1
公司名称不能小于四个字,行业类别不能为空,职务/岗位不能为空,公司电话不能小于8位且真是有效2339S1
公司名称不能小于四个字,行业类别不能为空,职务/岗位不能为空,公司电话不能小于8位且真是有效4057S1
公司名称不能小于四个字,行业类别不能为空,职务/岗位不能为空,公司电话不能小于8位且真是有效5889S1
公司名称不能小于四个字,行业类别不能为空,职务/岗位不能为空,公司电话不能小于8位且真是有效9090S1

关于代码中涉及到的函数说明

CONCAT()

拼接函数
组合两部分形成一个字符串表达。
(看官方文档,只包括两个参数)

CONCAT官方说明

在这里插入图片描述

POSSER()

函数返回查找字符串在被查找字符串中第一次出现的位置。
在这里插入图片描述
POSSTR官方文档

官网示例:

Example: Select the RECEIVED column, the SUBJECT column, and the starting position of the string ‘GOOD BEER’ within the NOTE_TEXT column for all rows in the IN_TRAY table that contain that string.
结果返回RECEIVED列, SUBJECT列,以及字符串 ‘GOOD BEER’ 在 NOTE_TEXT列中第一次出现的位置。

   SELECT RECEIVED, SUBJECT, POSSTR(NOTE_TEXT, 'GOOD BEER')FROM IN_TRAYWHERE POSSTR(NOTE_TEXT, 'GOOD BEER') <> 0;

LOCATE()

在这里插入图片描述
LOCATE()函数与POSSER()类似,参数数量不同
LOCATE()函数返回查找字符串在被查找字符串中第一次出现的位置,与POSSER()不同的是,它可以指定开始的位置以及编码计算的方式(CODEUNITS16, CODEUNITS32, or OCTETS)。
官方示例:
Locate the character ‘ß’ in the string ‘Jürgen lives on Hegelstraße’, and set the host variable LOCATION with the position, as measured in CODEUNITS32 units, within the string.
返回字符 'ß’在字符串’Jürgen lives on Hegelstraße’中的位置,从第一位之后开始计算

   SET :LOCATION = LOCATE('ß','Jürgen lives on Hegelstraße',1,CODEUNITS32);

GBASE实现

上例改写

参考文章:
MySql字符串拆分实现split功能(字段分割转列、转行)

GBASE中 WITH AS 函数相较于DB2会有限制,因此不推荐使用(需要指定模式名称)

对于这个问题,我们要明确:
1、循环多少次
2、如何控制循环的次数

循环次数求取:
对于该字符串:
公司名称不能小于四个字,行业类别不能为空,职务/岗位不能为空,公司电话不能小于8位且真是有效

我们需要将其分为四段,每个逗号作为分隔

那么循环次数可以这样表示:

LENGTH(STR) - LENGTH(REPLACE(STR,',',''))

将逗号替换为空格,用含逗号的字符串的长度减去不含逗号的字符串长度,得到的就是逗号的数量,也就是循环的次数

对于如何控制循环,我们需要引入一个序列数,上述文章使用了MySQL中的系统表中的ID作为序列,我们可以新建一个表,存入这个自增序列作为辅助,因为希望在一个sql中完成这个操作,因此我这里使用row_number()over()函数自己创建一个序列

那么完整地代码如下所示:

SELECT H1.ID ,SUBSTRING_INDEX(SUBSTRING_INDEX(H1.STR,',',SEQ),',',-1)  AS STRFROM TABLENAMEINNER JOIN (SELECT ROW_NUMBER()OVER(ORDER BY STR) AS SEQ ,T.* FROM TABLENAME T ORDER BY SQE) H2ON H2.SEQ<= LENGTH(H1.STR) - LENGTH(REPLACE(H1.STR,',',''))
这里我们得到的是上述STEP2的结果:(而且没有冗余的字段)
IDSTR
S1公司名称不能小于四个字,
S1行业类别不能为空,
S1职务/岗位不能为空,
S1公司电话不能小于8位且真是有效

另外一个例子

INSU表中存了保险代码以及付费期间两个字段,但是一个产品有多个付费期间,用符号’|'分隔,我们希望将付费期间字段拆开。
如表:
在这里插入图片描述
希望得到的结果:
在这里插入图片描述

代码:

SELECT H1.PROD_CD,SUBSTRING_INDEX(SUBSTRING_INDEX(H1.PAY_TERM,'|',ID),'|',-1)FROM INSU
INNER JOIN (SELECT ROW_NUMBER()OVER(ORDER BY PAYTERM) AS ID ,T.*  FROM INSU T ORDER BY ID )  H2 ON  H1.ID <= LENGTH(H1.PAY_TERM) - LENGTH(REPLACE(H1.PAY_MENT,'|','')) +1 

SUBSTRING_INDEX ()函数

SUBSTRING_INDEX function
在这里插入图片描述
以分隔符为界,将字符串划分为几个部分,然后返回前几个部分的字符串。

示例:

SUBSTRING_INDEX("www.ibm.com", ".", 2)  

returns the leading characters www.ibm because count > 0.
返回值为:www.ibm
如果最后一个参数为负数的话:
示例:

SUBSTRING_INDEX("www.ibm.com", ".", -2)  

返回值为:ibm.com (从后往前数)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/676028.shtml

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

相关文章

【OrangePi Zero2的系统移植】OrangePi Zero2 SDK说明

一、使用环境要求 二、获取Linux SDK 三、首次编译完整SDK 基于OrangePi Zero2的系统移植 之前我们讲解香橙派的使用时&#xff0c; 都是直接在香橙派上进行代码编译&#xff0c; 但在实际的项目开发过程中&#xff0c;更多 的还是使用交叉编译环境进行代码的编译。再编译完成…

卷积层Conv1d包含的元素分别是什么,经过卷积层,数据的形状发生变化吗?

nn.Conv1d 是一个一维卷积层&#xff0c;它通常用于处理序列数据&#xff0c;如时间序列或文本数据。这个层包含以下主要元素&#xff1a; 输入通道数&#xff08;In_channels&#xff09;&#xff1a;这是输入数据的通道数。对于单通道数据&#xff08;如灰度图像或单变量时间…

医学三基答案在哪搜?4个大学生必备的搜题 #知识分享#职场发展

今天&#xff0c;我将分享一些受欢迎的、被大学生广泛使用的日常学习工具&#xff0c;希望能给你的学习生活带来一些便利和启发。 1.颐博咨询 这是一个网站 找题好用的在线搜题站,快考不限次搜题助手,问题截图搜题软件,练题通关考试试题大全。 2.题小聪 这是一个公众号 这…

macbookair怎么清理内存 ?如何利用 CleanMyMac X 进行系统清理

macbookair怎么清理内存 清理MacBook Air的内存可以通过以下几种方法&#xff1a; 优化储存空间。在MacBook Air上&#xff0c;可以通过“优化储存空间”来释放空间。这包括将文件储存在iCloud中&#xff0c;如桌面、文稿和iCloud信息&#xff0c;以及自动移除在iCloud中观看…

CSP-202203-1-未初始化警告

CSP-202203-1-未初始化警告 难点&#xff1a;时间复杂度 【核心】&#xff1a;统计输入的k组“赋值”中&#xff0c;右值不为0且未在先前作为左值出现过的次数【坑!】本题直接通过暴力枚举时间复杂度很可能过不了 【90分思路】 定义数组 initialized 用来存储已经处理过的左…

从中序与后序遍历序列构造二叉树

给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&#xff1a;[3…

Flink CDC 与 Kafka 集成:Snapshot 还是 Changelog?Upsert Kafka 还是 Kafka?

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维…

MySQL-SQL优化

文章目录 1. SQL性能分析1.1 SQL执行频率1.2 慢查询日志1.3 profile详情1.4 explain 2. SQL优化2.1 Insert 优化2.2 Group By 优化2.3 Order By 优化2.4 Limit 优化2.5 Count() 优化2.6 Update 优化 3. 拓展3.1 请你说一下MySQL中的性能调优的方法&#xff1f;3.2 执行 SQL 响应…

堆的概念实现

前言 本文将详细讲解堆。堆是一种二叉树&#xff08;一般是完全二叉树&#xff09;使用顺序结构的数组来存储。 tip&#xff1a;这里我们需要注意区分堆在不同地方的含义&#xff0c;这里的堆是一个数据结构&#xff0c;操作系统虚拟进程地址空间的堆是操作系统中管理内存的一块…

kubernetes镜像仓库harbor

一、镜像仓库的种类 GitHub GitHub有付费版和免费版,目前默认的docker镜像拉取策略是从GitHub上进行拉取gitee 国内harbor私有仓库二、harbor仓库规划设计 私有镜像仓库 Harbor 安装和配置 新创建一台虚拟机安装harbor, 配置如下: 主机名ip配置网络harbor192.168.1.204VCPU/…

「深度学习」长短时记忆网络LSTM

一、经典模型 \widetilde{c}^{<t>} tanh(w_{c}[a^{<t-1>},x^{<t>}]b_{c}) 更新门&#xff1a;\Gamma_{u} \sigma(w_{u}[a^{<t-1>},x^{<t>}]b_{u}) 遗忘门&#xff1a;\Gamma_{f} \sigma(w_{f}[a^{<t-1>},x^{<t>}]b_{f}) 输出门…

svg 进阶

svg 进阶 svg 应用场景 绘制 icon绘制动画 svg viewport 和 viewBox viewport 是 svg 图像的可见区域 viewBox 是用于在画布上绘制 svg 图形的坐标系统 在一下案例中 svg中 width“500” height“200” 就是可视区域 比如你的svg是100X100但是你的可视区域只有20X20 那么他…

职业性格测试在求职应聘跳槽中的应用

人的性格总是千奇百怪&#xff0c;有的人总是想迎接挑战&#xff0c;超越自己&#xff0c;不停的奔着高处走&#xff0c;然而有的人总是喜欢随遇而安&#xff0c;踏踏实实一辈子&#xff0c;有份安稳的工作&#xff0c;有吃有喝就好。那么对于哪些喜欢迎接挑战&#xff0c;但又…

《MySQL 简易速速上手小册》第4章:数据安全性管理(2024 最新版)

文章目录 4.1 用户认证和权限控制4.1.1 基础知识4.1.2 重点案例&#xff1a;使用 Python 管理 MySQL 用户权限4.1.3 拓展案例 4.2 防止 SQL 注入和其他安全威胁4.2.1 基础知识4.2.2 重点案例&#xff1a;使用 Python 和 MySQL 进行安全的数据查询4.2.3 拓展案例 4.3 数据加密和…

边缘人工智能的发展 —— 边缘AI图形化开发

1、背景 边缘人工智能是指直接在边缘设备上运行的机器学习算法的形式使用人工智能。这里的“边缘设备”指的是网络边缘的设备&#xff0c;例如智能手机、传感器、工业机器人等。这些设备具备数据处理和机器学习算法运行的能力&#xff0c;可以在本地进行必要的数据操作并发送&…

Android Studio无法安装Git问题解决(折中方案)

安装配置好studio&#xff0c;往往会使用git克隆github上面的项目&#xff0c;但是却发现git无法正确安装&#xff0c;本文将介绍如何解决git无法安装这一问题。 对于git安装&#xff0c;实际比较复杂&#xff0c;可以参考这一篇博客。 Git 详细安装教程&#xff08;详解 Gi…

二维差分---三维差分算法笔记

文章目录 一.二维差分构造差分二维数组二维差分算法状态dp求b[i][j]数组的二维前缀和图解 二.三维前缀和与差分三维前缀和图解:三维差分核心公式图解:模板题 一.二维差分 给定一个原二维数组a[i][j],若要给a[i][j]中以(x1,y1)和(x2,y2)为对角线的子矩阵中每个数都加上一个常数…

Java SE多态

文章目录 1.多态&#xff1a;1.1.什么是多态&#xff1a;1.2.多态实现条件&#xff1a;1.2.1.重写&#xff1a;1.2.2.向上转型&#xff1a; 1.多态&#xff1a; 1.1.什么是多态&#xff1a; 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去…

54.螺旋矩阵(Java)

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 输入&#xff1a; matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a; [1,2,3,6,9,8,7,4,5] 代码实现&#xff1a; import java.util.ArrayLi…

【数据结构与算法】力扣刷题记之 稀疏数组

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…