1.前言

  最近因项目需求,需要把员工的工作组返回给前台,但是数据库是把员工的工作组Id,都存在一个字段内了(以“逗号”分隔),而这样不符合前台的需要,他们需要一行,一行的数据。如:

  数据库:

userId, workgroup
,,
,,

  前台需要:

userId, workgroup

2. 分析思路:

  大体的思路是这样的:

  首先:要知道,每一员工最多有多少个组。

  其次:建一个有关“数”的临时表,与上面的组数进行关联,这样就出现了“多”行

  最后:多“行”有了,剩下的就是对每一行的组进行刷选。如第一行取第一个逗号左边的,第二行取第二个逗号左边的, 依此类推。

3. 实现:

  根据上次的思路,来实现:

  第一步: 

with v_usergroups as (select '' as userId,'10,12,15' as workgroups from dual
union
select '' as userId,'2,4,5' as workgroups from dual
)
select userid,',' || workgroups ||',' AS tempgroups,length(workgroups || ',') - nvl(length(REPLACE(workgroups, ',')), 0) AS groupcount FROM v_usergroups

  PS: 这里在"workgroup" 的前后也加了逗号,是为了后面使用方面。

  第二步:

select LEVEL lv from dual CONNECT BY LEVEL <= 5

  PS:这里的5,我们是根据业务需要,每一员工最多分为5个组,当然也可以写其他的值,但一定要大于第一步求得的"groupcount".

  到这里后,我们对这两个表进行关联,看看值怎么样:

with v_usergroups as (select '' as userId,'10,12,15' as workgroups from dual
union
select '' as userId,'2,4,5' as workgroups from dual
)
select * from
(select userid,',' || workgroups ||',' AS tempgroups,length(workgroups || ',') - nvl(length(REPLACE(workgroups, ',')), 0) AS groupcount FROM v_usergroups ) a,
(select LEVEL lv from dual CONNECT BY LEVEL <= 5) b where b.lv<=a.groupcount
order by userid,lv
       USERID    TEMPGROUPS    GROUPCOUNT    LV
1 1001 ,10,12,15, 3 1
2 1001 ,10,12,15, 3 2
3 1001 ,10,12,15, 3 3
4 1002 ,2,4,5, 3 1
5 1002 ,2,4,5, 3 2
6 1002 ,2,4,5, 3 3

  到这里,就离我们最终的结果很近了。 只需要在外层对"tempgroups"做一下简单的处理就可以了:

  第三步:

    这一步的主要思路就是:截串。第一个组应该是第一逗号和第二个逗号之间的值,第二个组应该是第二个逗号与第三个逗号之间的值,那第一个,和第二个如何表示呢,其实就是利用字段lv。也就是:

    substr(tempgroups,instr(tempgroups, ',', 1, lv) + 1,instr(tempgroups, ',', 1, lv + 1) - (instr(tempgroups, ',', 1, lv) + 1))

    最后的SQL 如下:

with v_usergroups as (select '' as userId,'10,12,15' as workgroups from dual
union
select '' as userId,'2,4,5' as workgroups from dual
)
select userid,substr(tempgroups,instr(tempgroups, ',', 1, lv) + 1,instr(tempgroups, ',', 1, lv + 1) - (instr(tempgroups, ',', 1, lv) + 1)) from
(select userid,',' || workgroups ||',' AS tempgroups,length(workgroups || ',') - nvl(length(REPLACE(workgroups, ',')), 0) AS groupcount FROM v_usergroups ) a,
(select LEVEL lv from dual CONNECT BY LEVEL <= 5) b where b.lv<=a.groupcount
order by userid,lv

Oralce 按分隔符把一列转成多行的更多相关文章

  1. SQL Server 行转列,列转行。多行转成一列

    一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name , value = ( STUFF(( SELECT ',' + va ...

  2. SQL查询结果列拼接成逗号分隔的字符串:group_concat

    转自:SQL查询结果列拼接成逗号分隔的字符串 背景:做SQL查询时会经常需要,把查询的结果拼接成一个字符串. 解决方法: 通过 group_concat 函数 拼接的结果很长,导致拼接结果显示不全,可 ...

  3. C#将datatable的某一列转换成json格式的字符串

    将datatable的某一列转换成json格式的字符串(转换完后自己在字符串前后加{}) /// <summary> ///DataTable装换 Column数据 组合成json 现在的 ...

  4. 将excel按照某一列拆分成多个文件(方案整理)

    1解决方案:将excel按照某一列拆分成多个文件 https://blog.csdn.net/ntotl/article/details/79141314 2遇到的问题:解决vbe6ext.olb不能 ...

  5. 学习excel的使用技巧复制一列文本成新列去重

    学习excel的使用技巧复制一列文本成新列去重 其实比较简单的技巧  知道了就会  不知道就比较麻烦 直接复制到一列 找到 数据选项 删除重复项

  6. 利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model

    利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model   使用场景:网站配置项目,为了便于管理,网站有几个Model类来管理配置文件, 比如ConfigWebsiteMo ...

  7. 【Azure 环境】Azure Resource Graph Explorer 中实现动态数组数据转换成多行记录模式 - mv-expand

    问题描述 想对Azure中全部VM的NSG资源进行收集,如果只是查看一个VM的NSG设定,可以在门户页面中查看表格模式,但是如果想把导出成表格,可以在Azure Resource Graph Expl ...

  8. DataGridView列的宽度、行的高度自动调整

    注意:DataGridView控件是从.NET Framework 2.0版本开始追加的. 介绍一下DataGridView列的宽度和行的高度,根据单元格或Header的内容(一般是内容全部被表示)自 ...

  9. 转:DataGridView列的宽度、行的高度自动调整

    注意:DataGridView控件是从.NET Framework 2.0版本开始追加的. 介绍一下DataGridView列的宽度和行的高度,根据单元格或Header的内容(一般是内容全部被表示)自 ...

随机推荐

  1. 1、发布C++实现的TCP网络框架Khala

    1.Khala简介 Khala(卡拉)是用C++实现的TCP网络框架.底层采用muduo网络库作为网络IO+线程模型,并封装实现了网络实现与业务逻辑分离的多线程网络框架,具有超时退出.多设备多事件注册 ...

  2. hdu 2438Turn the corner 三分

    Turn the corner Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  3. git命令简图

    基本概念 版本库(repository)=.git目录 工作区(working)=当前工作的目录 暂存区(stage)=临时缓存 图示 仓库操作 分支操作 工作区操作 参考链接(相当好) http:/ ...

  4. iframe的操作

    获取iframe的window,获取Iframe的document,获取父页面的window,某个环境是否iframe,动态创建iframe 这是demo.html,这个页用iframe嵌入了ifra ...

  5. [POJ] 1511 Invitation Cards

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 18198   Accepted: 596 ...

  6. Netbeans7.4下搭建struts2.3.16

    一:所需要的jar包如下: 在WEB-INF目录下新建一个lib文件夹将jar包复制到里面: 在这里要注意将jar包导入lib目录里还不可以,在这里与MyEclipse不同.在项目上右键属性-> ...

  7. BZOJ 2661 连连看

    http://www.lydsy.com/JudgeOnline/problem.php?id=2661 思路:预处理出每个数字,然后若有x^2=y^2+z^2且z与y互质, s->x 1 ,0 ...

  8. 单片机C 语言与汇编语言混合编程

    在单片机应用系统设计中,过去主要采用汇编语言开发程序. 汇编语言编写的程序对单片机硬件操作很方便,编写的程序代码短,效率高,但系统设计的周期长,可读性和可移植性都很差.C语言程序开发是近年来单片机系统 ...

  9. PowerShell_零基础自学课程_2_Powershell与Cmd以及Unix/Linux Shell

    上篇文章我说道,windows为了改变用户对其console界面的诟病,于是就从windows   vista开始,计划要改变这种局面,于是就有 了Powershell的出现. 1.兼容shell命令 ...

  10. 搜索Collections元素,用DateFormatSymbols 获得月份

    import java.util.Collections; import java.util.List; import java.text.DateFormatSymbols; import java ...