SELECT REGEXP_SUBSTR(bjdm||',', '[^,]+', 1, LEVEL, 'i') AS STR,bjdm FROM valueWeekInfo
CONNECT BY LEVEL <= LENGTH(bjdm) - LENGTH(REGEXP_REPLACE(bjdm, ',', '')) + 1;

可以将 bjdm 换成 '01,02,03,04' , valueWeekInfo 换成dual 查看结果

SELECT REGEXP_SUBSTR(zzjs, '[^,]+', 1, ROWNUM, 'i') str,zzjs FROM
(select zzjs from bjpjxxb group by zzjs )
CONNECT BY ROWNUM <= LENGTH(zzjs) - LENGTH(REGEXP_REPLACE(zzjs, ',', ''))+1

有时用RowNum会出现 一些问题,结合上面的LEVEL使用

 WITH test AS
(SELECT 1 id1, 'aaa,bbb,ccc,ddd' id2
FROM dual
UNION ALL
SELECT 2 id1, 'eee,fff,ggg,hhh,kkkk,ivwshjj' id2 FROM dual) SELECT id1,
substr(t.ca,
instr(t.ca, ',', 1, d.lv) + 1,
instr(t.ca, ',', 1, d.lv + 1) -
(instr(t.ca, ',', 1, d.lv) + 1)) AS d
FROM (SELECT id1,
',' || id2 || ',' AS ca,
length(id2 || ',') - nvl(length(REPLACE(id2, ',')), 0) AS cnt
FROM test) t,
(SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 100) d
WHERE d.lv <= t.cnt
ORDER BY id1 SELECT substr(t.classid,instr(t.classid, ',', 1, d.lv) + 1,
instr(t.classid, ',', 1, d.lv + 1) -
(instr(t.classid, ',', 1, d.lv) + 1)) str,classid,vid FROM
(select vid,',' || classid || ',' classid
,length(classid || ',') - nvl(length(REPLACE(classid, ',')), 0) AS cnt from classvedio
where createtime between '2015-09-01' and '2015-12-31' group by classid,vid) t,
(SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 100) d
WHERE d.lv <= t.cnt
ORDER BY vid,str desc
SELECT REGEXP_SUBSTR(classid, '[^,]+', 1, lv, 'i') AS STR,classid,vid,lv FROM
(
select * from (
select vid,',' || classid || ',' classid
,length(classid || ',') - nvl(length(REPLACE(classid, ',')), 0) AS cnt
from classvedio) c,
(SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= (select max(length(classid)) from classvedio)) d
WHERE d.lv <= c.cnt
ORDER BY vid desc,lv asc
)

最终完成版本

 /// <summary>
/// 将某表的某列拆分成多行数据,返回的结构为
/// str,拆分出来的每一个字段
/// lv,拆分行数
/// primarycols
/// key
/// </summary>
/// <param name="tablename">表名</param>
/// <param name="primarycols">表主键列</param>
/// <param name="key">要拆分的列</param>
/// <param name="splitchar">分隔字符串</param>
/// <returns></returns>
public static string GetCommand(string tablename, string primarycols, string key,string splitchar)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(string.Format("SELECT REGEXP_SUBSTR({0}, '[^{2}]+', 1, lv, 'i') AS STR,{1},{0},lv FROM (", key, primarycols,splitchar));
sb.AppendLine(string.Format("select * from (select {0},'{2}' || {1} || '{2}' {1}", primarycols, key,splitchar));
sb.AppendLine(string.Format( ",length({0} || '{1}') - nvl(length(REPLACE({0}, '{1}')), 0) AS cnt",key,splitchar));
sb.AppendLine(string.Format( "from {0}) c,",tablename));
sb.AppendLine(string.Format("(SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= (select max(length({0})) from {1})) d", key, tablename));
sb.AppendLine(string.Format( "WHERE d.lv <= c.cnt ORDER BY {0},lv asc",primarycols));
sb.AppendLine(")");
return sb.ToString();
}

Oracle 正则 一行转多行的更多相关文章

  1. Oracle一列的多行数据拼成一行显示字符

    Oracle一列的多行数据拼成一行显示字符   oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数.    www.2cto.com   先介绍:WMSYS.WM_CO ...

  2. VS2012 利用正则统计项目代码行数

    原文:VS2012 利用正则统计项目代码行数 #开头和/开头或者空行都不计入代码量,  搜索出来以后最后一行就是代码行数了:

  3. winform代码:关联窗体数据更新,删除dataGridview中选中的一行或多行

    一.关联窗体数据更新 关联窗体数据修改时,如果一个为总体数据显示窗体A,另一个为详细修改窗体B,从A进入B,在B中对数据进行修改,然后返回A,这时A窗体的数据需要更新. 我采用最简单的方法,首先保证每 ...

  4. HNU13028Attacking rooks (二分匹配,一行变多行,一列变多列)

    Attacking rooks Time Limit: 20000ms, Special Time Limit:50000ms, Memory Limit:65536KB Total submit u ...

  5. hive 实现一个字段多行转一行 和 一行转多行

    1.多行转一行 多行转一行可以通过concat_ws(',',collect_set(col_name)) as col_new的方式实现,可以参考:https://www.cnblogs.com/s ...

  6. hive一行变多行及多行变一行

    hive一行变多行及多行变一行 场景 name alias zhaoqiansun abc def ghi 处理数据时需要将上表处理成为下面的形式: name alias zhaoqiansun ab ...

  7. Oracle sql%rowcount 返回影响行数;sql server @@RowCount返回影响行数

    sql server中,返回影响行数是:If @@RowCount<1 Oracle中,返回影响行数是:If sql%rowcount<1 例: sqlserver: create pro ...

  8. hivepython 实现一行转多行

    案例1: ==效果等同于一行转多行 数据表名称:zhangb.gid_tags 数据格式,每行是2个字段,(gid,tags) ,可能有脏数据,分隔符为“\t”,   ANDROID-9de77225 ...

  9. 一行转多行 及多行转一行的 hive语句

      注意 :|,: 是特殊符号,要用 "\\|", "\\;"来表示.   一行转多行 usertags 里面有很多项,每项之间以逗号分隔   create t ...

随机推荐

  1. 第一百二十五节,JavaScript,XML

    JavaScript,XML 学习要点: 1.IE中的XML 2.DOM2中的XML 3.跨浏览器处理XML 随着互联网的发展,Web应用程序的丰富,开发人员越来越希望能够使用客户端来操作XML技术. ...

  2. js---疑点代码段解析

    function count() { var arr = []; for (var i=1; i<=3; i++) { console.log("iii---"+i); ar ...

  3. tomcat解压版安装(摘自网络)

    配置Tomcat[解压版] 选择解压版的Tomcat的理由是可以让我们使用多个Tomcat,但是配置上就会出现一些问题,需要我们手动进行更改配置.我的Tomcat版本是:apache-tomcat-6 ...

  4. java中float和double的区别

    float表示单精度浮点数在机内占4个字节,用32位二进制描述. double表示双精度浮点数在机内占8个字节,用64位二进制描述.浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分. ...

  5. Spring MVC(二)

    spring mvc工作流 1A)客户端发出http请求,只要请求形式符合web.xml 文件中配置的*.action的话,就由DispatcherServlet 来处理. 1B)Dispatcher ...

  6. Unity 5 Game Optimization

    2. Scripting Strategies 2.1 Cache Component references (缓存组件引用) 使用 Rigidbody rigidbody = GetComponen ...

  7. Delphi @ # $ 特殊字符含义

      ^: 指针   @: 取址  #: 十进制符   $: 十六进制符

  8. 关于ASCII,Unicode和UTF-8

    自己也不是很明白这些编码,百度了一下,整理出来与大家分享分享,在此感谢作者. 先说说这些编码 ANSI:最早的时候计算机ASCII码只能表示256个符号(含控制符号),这个字符集表示英文字母足够,其中 ...

  9. SQL防漏洞注入攻击小结

    3///   4/// 判断字符串中是否有SQL攻击代码  5///   6/// 传入用户提交数据  7/// true-安全:false-有注入攻击现有:  8public bool Proces ...

  10. ACdream 1728 SJY's First Task

    简单题. 先建树,我用邻接表来存了.然后对于每个叶子结点DFS一下,DFS深度超过了K就return,找到了叶子节点就记录下来,最后排个序,然后输出答案. 由于结点编号比较奇葩,所以用两个map来转换 ...