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

news2024/9/23 16:29:39

问题描述:

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

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,','),','),
       ID
  FROM TABLE_NAME
  WHERE ID = 'S1')
  UNION ALL
  SELECT 
  STR,
  POS+1,
  LOCATE(',',STR,POS+1),
  STR
  FROM 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_TRAY
     WHERE 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 STR
 FROM TABLENAME
 INNER JOIN (SELECT ROW_NUMBER()OVER(ORDER BY STR) AS SEQ ,T.* 
               FROM TABLENAME T 
               ORDER BY SQE) H2
          ON 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.coloradmin.cn/o/1440535.html

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

相关文章

春运也要“信号升格”:中兴通讯助运营商打造高铁精品网

一年一度的春运&#xff0c;承载了游子的思乡情。据官方预计&#xff0c;今年春运跨区域人员流动量将达到90亿人次&#xff0c;创下历史新高&#xff0c;铁路、公路、水路、民航等营业性客运量全面回升&#xff0c;其中铁路预计发送旅客4.8亿人次&#xff0c;日均1200万人次&am…

网络设备如何巡检?这些命令必不可少

一、查看交换机的端口使用情况&#xff1a; dis interface brief查看交换机的哪个端口是万兆端口&#xff0c;以及端口状态&#xff0c;那个端口在使用。 如下图&#xff0c;使用这个命令。 其中端口0/0/1与端口0/0/2处于使用中。其它接口没有使用&#xff1b;如果在实际项目…

[Python进阶] 制作动态二维码

11.1 制作动态二维码 二维码&#xff08;QR code&#xff09;是一种二维条形码&#xff08;bar code&#xff09;&#xff0c;它的起源可以追溯到20世纪90年代初。当时&#xff0c;日本的汽车工业开始使用一种被称为QR码的二维条码来追踪汽车零部件的信息。 QR码是Quick Respo…

机器人学、机器视觉与控制 上机笔记(第一版译文版 2.1章节)

机器人学、机器视觉与控制 上机笔记&#xff08;第一版译文版 2.1章节&#xff09; 1、前言2、本篇内容3、代码记录3.1、新建se23.2、生成坐标系3.3、将T1表示的变换绘制3.4、完整绘制代码3.5、获取点*在坐标系1下的表示3.6、相对坐标获取完整代码 4、结语 1、前言 工作需要&a…

JRebel激活-nginx版本

nginx转发流量&#xff08;代替其他网上说的那个工具&#xff09; proxy_pass http://idea.lanyus.com; 工具激活 填写内容说明&#xff1a; 第一行的激活网址是&#xff1a;http://127.0.0.1:8888/ 正确的GUID。GUID 可以通过专门的网站来生成&#xff08;点击打开&#…

问题:创业者在组建创业团队时,在个人特征和动机方面更应该注重创业者的( ) #知识分享#微信#媒体

问题&#xff1a;创业者在组建创业团队时&#xff0c;在个人特征和动机方面更应该注重创业者的&#xff08; &#xff09; 参考答案如图所示

C++分支语句

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家新年快乐&#xff0c;今天&#xff0c;我们来了解一下分支语句。 文章目录 1.什么是分支语句 1.if语句 基本形式 用法说明 练习 2.if-else语句 基本形式 用法说明 练习 3.switch语句 基本形式…

推荐研发度量思码逸的研发度量工具及视频教学

目前国内做研发度量中&#xff0c;思码逸的研发度量工具的确做的不错&#xff0c;网址是&#xff1a;思码逸-专业的软件研发效能度量分析平台 看到一个不错的介绍视频&#xff1a;《让数据说话&#xff0c;高效盘点企业研发效能》&#xff0c; 地址是&#xff1a;视频课程&…

bert+np.memap+faiss文本相似度匹配 topN

目录 任务 代码 结果说明 任务 使用 bert-base-chinese 预训练模型将文本数据向量化后&#xff0c;使用 np.memap 进行保存&#xff0c;再使用 faiss 进行相似度匹配出每个文本与它最相似的 topN 此篇文章使用了地址数据&#xff0c;目的是为了跑通这个流程&#xff0c;数…

Mac使用AccessClient打开Linux堡垒机跳转闪退问题解决

登录公司的服务器需要使用到堡垒机&#xff0c;但是mac使用AccessClient登录会出现问题 最基础的AccessClient配置 AccessClient启动需要设置目录权限&#xff0c;可以直接设置为 权限 777 chmod 777 /Applications/AccessClient.app注: 如果不是这个路径,可以打开终端,将访达中…

uniapp设置不显示顶部返回按钮

一、pages文件中&#xff0c;在相应的页面中设置 "titleNView": {"autoBackButton": false} 二、对应的页面文件设置隐藏元素 document.querySelector(.uni-page-head-hd).style.display none

Tomcat组件架构与数据流

一、背景与简介 Tomcat我们都知道是一个开源的、实现了大部分Java EE、Servlet、JSP规范的Servlet容器, 允许我们将实现了Serlvet接口的Web程序war包进行部署运行。 但是你有对Tomcat做过细致的学习么? 我相信大部分同学和我一样&#xff0c;之前也是只会进行简单使用&#x…

RisingWave 中文用户文档上线,阅读更高效!

为满足广大中文社区用户、开发者及流处理技术爱好者的需求&#xff0c;RisingWave 用户文档中文社区版今天上线了&#xff01; 中文版文档的推出&#xff0c;旨在为广大用户提供更便捷、高效的阅读体验&#xff0c;帮助大家深入理解并有效使用 RisingWave&#xff0c;发挥其更…

Python:流程控制

4.1 顺序结构 在任何编程语言中最常见的程序结构就是顺序结构。顺序结构就是程序从上到下一行行地执行&#xff0c;中间没有任何判断和跳转。 如果Python程序的多行代码之间没有任何流程控制&#xff0c;则程序总是从上往下依次执行&#xff0c;排在前面的代码先执行&#xf…

1897_野火FreeRTOS教程阅读笔记_链表

1897_野火FreeRTOS教程阅读笔记_链表 全部学习汇总&#xff1a; g_FreeRTOS: FreeRTOS学习笔记 (gitee.com) 之前我自己通过直接啃代码的方式对FreeRTOS也算是有了一点理解了&#xff0c;这次趁着些许闲暇翻看一下野火的FreeRTOS教程。一者算是一种复习&#xff1b;二者可能对自…

【数据结构】二叉树的顺序结构及链式结构

目录 1.树的概念及结构 1.1树的概念 1.2树的相关概念 ​编辑 1.3树的表示 1.4树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1二叉树的概念 2.2现实中的二叉树 ​编辑 2.3特殊的二叉树 2.4二叉树的性质 2.5二叉树的存储结…

手把手教你设计接口自动化测试用例:提取接口信息并分析

随着市场需求的变化&#xff0c;大部分企业在招聘测试人员时&#xff0c;都会提出接口自动化测试的相关要求&#xff0c;为什么会这样呢&#xff1f; 目前&#xff0c;软件构架基本上都是前后端分离的&#xff0c;软件的主要功能由服务端提供。从整个软件测试市场来看&#xf…

政安晨:快速学会~机器学习的Pandas数据技能(三)(重命名与合并)

使用机器学习处理数据的第一步就得先理解它&#xff0c;咱们现在就帮助它们一起理解起来。 &#xff08;本篇文章这次换一套数据集&#xff0c;数据文件可以在文章头部下载&#xff0c;并保存至您的虚拟环境的目录中&#xff09; 不知道如何搭建环境的小伙伴请看我机器学习笔…

超九成飘红,银行成开年唯一逆势上涨板块

2024年开年以来&#xff0c;A股银行板块表现令人瞩目。 Choice数据显示&#xff0c;按照申万&#xff08;2021&#xff0c;仅A股&#xff09;分类&#xff0c;2024年开年以来&#xff0c;银行板块是唯一一个逆势上涨板块&#xff0c;平均涨幅为6.53%。 年内银行股近乎全线上涨…

【C语言期末】商品管理系统

本文资源&#xff1a;https://download.csdn.net/download/weixin_47040861/88820155 1.题目要求 商品管理系统 商品信息包括&#xff1a;包括编号、类别、名称、价格、折扣比例、生产时间 、存货数量等要求&#xff1a;1、信息首先保存在文件中&#xff0c;然后打开文件进行…