`
53873039oycg
  • 浏览: 843935 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

oracle简单按分隔符单行转多行sql

 
阅读更多

       今天看到篇博客,http://www.cnblogs.com/hankuikui/p/3523013.html,说的是按分隔符把一列转成多行,原文给出的方法是

      

with tmp_t as
 (select '1001' as userId, '10,12,15' as workgroups
    from dual
  union
  select '1002' 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 tmp_t) a,
       (select LEVEL lv from dual CONNECT BY LEVEL <= 5) b
 where b.lv <= a.groupcount
 order by userid, lv

    结果为

   

     使用了CONNECT BY 构造1-5的lv值和instr截取,详细分析见原文

 

     个人看到connect by level <=5总想这替换掉5,只要得到表中最大的,个数就可以了,如下

    

with tmp_t as
 (select '1001' as userid, '10,12,15' as workgroups
    from dual
  union
  select '1002' 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 tmp_t) a,
       (select level lv
          from dual
        connect by level <= (select max(length(workgroups) -
                                        length(replace(workgroups, ',', ''))) + 1
                               from tmp_t)) b
 where b.lv <= a.groupcount
 order by userid, lv

   

    上面的写法简单易懂,恰巧昨天看到篇文章,里面有更好的写法,原文链接http://www.dewen.org/q/16184/%E4%BB%A5%E5%A4%8D%E6%9D%82%E6%95%B0%E6%8D%AE%E5%AD%97%E6%AE%B5%E5%88%86%E7%BB%84%E6%9F%A5%E8%AF%A2
   

    更好的写法如下

   

with tmp_t as
 (select '1001' as userid, '10,12,15' as workgroups
    from dual
  union
  select '1002' as userid, '2,4,5' as workgroups from dual)
select userid,
       --regexp_substr(str,reg,起始位置 第几次)
       regexp_substr(workgroups, '[^,]+', 1, level) clr
  from tmp_t
connect by level <= regexp_count(workgroups, ',') + 1
       --regexp_count(workgroups, ',') 统计字符串中,的数量
       --用法参考http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions135.htm#SQLRF51665
       and userid = prior userid
       and prior dbms_random.value is not null

    相当简洁,很不错的写法,结果和上面的一样

 

    全文完

    

  

  • 大小: 23.3 KB
0
0
分享到:
评论

相关推荐

    oracle将以逗号分隔字符串转多行

    在Oracle数据库中,将逗号分隔的字符串转换为多行是常见的数据处理需求,尤其在需要对每个分隔项进行单独操作时。这个过程通常涉及到字符串处理函数,如`REGEXP_SUBSTR`和`REPLACE`,以及层次查询结构`CONNECT BY`。...

    Oracle多行记录合并

    它接受一个排序表达式和一个分隔符,返回所有行的合并结果。例如,假设我们有一个名为`orders`的表,其中包含`customer_id`和`order_item`字段,可以使用以下查询来合并每个客户的所有订单项: ```sql SELECT ...

    oracle10g,9i多行合并一行函数

    ### Oracle 10g与9i中的多行合并为一行函数详解 在Oracle数据库系统中,经常需要将多个行的数据合并成单行显示,尤其是在处理报告或者需要将多个值组合成一个字符串的情况下。本文将详细介绍如何在Oracle 10g与9i...

    DBA对Oracle SQL编写规范的总结

    ### DBA对Oracle SQL编写规范的总结 #### 一、引言 在Oracle数据库开发过程中,遵循一套标准化的SQL编写规范对于提升代码质量、增强可读性和可维护性至关重要。本文档由一位经验丰富的数据库管理员(DBA)撰写,旨在...

    Oracle 开发DBA SQL编写规范

    - 单行注释使用`--`,多行注释使用`/* ... */`。 - 示例: ```sql -- 查询用户信息 select * from user_info; /* 查询订单详情 包括订单状态、金额等信息 */ select order_id, status, amount from orders;...

    第2章 PL-SQL基础

    - 简单分隔符如 `+` 表示加法操作。 - 复合分隔符如 `:=` 表示赋值操作。 2. **标识符**:用于命名PL/SQL中的各种元素,如常量、变量、异常等。 - 合法的标识符可以由字母、数字、美元符号 `$`、下划线 `_` 和井...

    OracleMySQL数据库SQL编程规范.rar

    在Oracle和MySQL中,单行注释使用"--",多行注释使用"/*...*/"。 2. **命名规范**:表名、列名应遵循驼峰式或下划线分隔的命名规则,避免使用保留字,并保持一致性。使用有意义的名称,以便于理解。 3. **缩进与...

    oracle实现多行合并的方法

    `LISTAGG`函数不仅可以处理字符串类型的数据,还可以处理数值类型,并且可以自定义分隔符。例如,使用`LISTAGG`来实现相同的功能: ```sql SELECT t.rank, LISTAGG(t.Name, ', ') WITHIN GROUP (ORDER BY t.Name) ...

    oracle材料

    它接受两个参数,一个是需要聚合的列,另一个是分隔符。例如,如果有个`orders`表包含`customer_id`和`product`列,你可以使用`listagg(product, ', ') within group (order by product)`来将每个客户购买的产品列表...

    oracle wm_concat 列转行 逗号分隔

    Oracle中的WM_CONCAT函数是一个非标准的聚合函数,主要用于将多行数据合并成单行,以逗号分隔的形式返回。这个函数在处理特定的数据汇总和报告需求时非常有用,尤其是在你需要将某个列的多个值合并成一个字符串时。...

    oracle行转列聚合函数WMSYS.WM_CONCAT

    Oracle数据库提供了多种方法来实现这一需求,其中`WMSYS.WM_CONCAT`是一个非常实用且高效的函数,它可以将多个字符串值合并成一个单独的字符串,并在每个值之间插入指定的分隔符。 #### 二、WMSYS.WM_CONCAT函数...

    精通oracle 10g plsql 编程-学习笔记

    - **PL/SQL词汇单元分隔符**: 如`;`用于分隔语句。 - **标识符**: 用于命名变量、函数等。 - **文本**: 包括数字文本、字符文本、字符串文本等。 - **注释**: 单行注释`--`或多行注释`/* */`。 - **PL/SQL代码编码...

    oracle语法大全

    `LISTAGG`是Oracle 11g版本引入的新功能,它允许我们对分组后的数据进行聚合,将同一组内的多行数据合并成单行,并以指定的分隔符连接。例如,假设我们有一个`employees`表,包含`employee_id`和`department`字段,...

    详解oracle管道函数的用法(一行拆为多行)

    Oracle管道函数是一种特殊类型的函数,它允许将单行数据转换为多行输出,这对于处理集合数据或进行数据分块操作非常有用。在Oracle数据库中,管道函数通过将数据流式传输到结果集中来实现这一点,而不是一次性返回...

    Oracle 数据导入工具

    在使用SQL*Loader时,我们需要创建一个控制文件,该文件描述了数据文件的结构,包括字段的分隔符、数据类型、长度等信息。例如,如果我们有一个CSV文件,控制文件可能包含如何处理逗号分隔的数据的指令。 在实际...

    数据库Oracle第2章.pptx

    - **分隔符**:语句间可以使用空格、回车或制表符分隔,以分号结束(Oracle)。 - **注释**:多行注释用`/*...*/`,单行注释用`--`(Oracle)。 2.2.2 数据类型 Oracle支持22种不同的SQL数据类型,其中包括: - ...

    Oracle_spool_用法详解

    - **优点**: 简单易用,只需要设置列分隔符即可。 - **缺点**: 导出的数据格式可能会出现不一致性,尤其是在数据量较大时容易出现问题。 - **示例**: ```sql set colsep '|' set trimspool on set linesize ...

    SQL Pretty Printer V3.12

    无论是单行注释还是多行注释,都能被恰当地格式化,使阅读者更容易理解代码的目的和功能。 3. **高亮显示**:SQL Pretty Printer V3.12支持语法高亮,可以突出显示关键字、函数、变量和其他重要元素,让代码在视觉...

    PL-SQL_Oracle教程[收集].pdf

    NESTRING函数在Oracle中用于字符串处理,可能用于将字符数组转换为单个字符串,或者在特定分隔符下拆分字符串。 这些是PL/SQL和Oracle教程中的基础概念,对于软件开发人员来说,理解和掌握这些内容是至关重要的,...

    oracle note.docx

    这份"Oracle Note"涵盖了从安装Oracle数据库到基本SQL语法、备份以及集群的相关知识,是初学者入门的良好资料。 首先,我们来看看Oracle数据库的启动和环境配置。在Day 1的笔记中提到了如何查找Oracle进程并确定SID...

Global site tag (gtag.js) - Google Analytics