今天看到篇博客,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
相当简洁,很不错的写法,结果和上面的一样。
全文完。
相关推荐
在Oracle数据库中,将逗号分隔的字符串转换为多行是常见的数据处理需求,尤其在需要对每个分隔项进行单独操作时。这个过程通常涉及到字符串处理函数,如`REGEXP_SUBSTR`和`REPLACE`,以及层次查询结构`CONNECT BY`。...
它接受一个排序表达式和一个分隔符,返回所有行的合并结果。例如,假设我们有一个名为`orders`的表,其中包含`customer_id`和`order_item`字段,可以使用以下查询来合并每个客户的所有订单项: ```sql SELECT ...
### Oracle 10g与9i中的多行合并为一行函数详解 在Oracle数据库系统中,经常需要将多个行的数据合并成单行显示,尤其是在处理报告或者需要将多个值组合成一个字符串的情况下。本文将详细介绍如何在Oracle 10g与9i...
### DBA对Oracle SQL编写规范的总结 #### 一、引言 在Oracle数据库开发过程中,遵循一套标准化的SQL编写规范对于提升代码质量、增强可读性和可维护性至关重要。本文档由一位经验丰富的数据库管理员(DBA)撰写,旨在...
- 单行注释使用`--`,多行注释使用`/* ... */`。 - 示例: ```sql -- 查询用户信息 select * from user_info; /* 查询订单详情 包括订单状态、金额等信息 */ select order_id, status, amount from orders;...
- 简单分隔符如 `+` 表示加法操作。 - 复合分隔符如 `:=` 表示赋值操作。 2. **标识符**:用于命名PL/SQL中的各种元素,如常量、变量、异常等。 - 合法的标识符可以由字母、数字、美元符号 `$`、下划线 `_` 和井...
在Oracle和MySQL中,单行注释使用"--",多行注释使用"/*...*/"。 2. **命名规范**:表名、列名应遵循驼峰式或下划线分隔的命名规则,避免使用保留字,并保持一致性。使用有意义的名称,以便于理解。 3. **缩进与...
`LISTAGG`函数不仅可以处理字符串类型的数据,还可以处理数值类型,并且可以自定义分隔符。例如,使用`LISTAGG`来实现相同的功能: ```sql SELECT t.rank, LISTAGG(t.Name, ', ') WITHIN GROUP (ORDER BY t.Name) ...
它接受两个参数,一个是需要聚合的列,另一个是分隔符。例如,如果有个`orders`表包含`customer_id`和`product`列,你可以使用`listagg(product, ', ') within group (order by product)`来将每个客户购买的产品列表...
Oracle中的WM_CONCAT函数是一个非标准的聚合函数,主要用于将多行数据合并成单行,以逗号分隔的形式返回。这个函数在处理特定的数据汇总和报告需求时非常有用,尤其是在你需要将某个列的多个值合并成一个字符串时。...
Oracle数据库提供了多种方法来实现这一需求,其中`WMSYS.WM_CONCAT`是一个非常实用且高效的函数,它可以将多个字符串值合并成一个单独的字符串,并在每个值之间插入指定的分隔符。 #### 二、WMSYS.WM_CONCAT函数...
- **PL/SQL词汇单元分隔符**: 如`;`用于分隔语句。 - **标识符**: 用于命名变量、函数等。 - **文本**: 包括数字文本、字符文本、字符串文本等。 - **注释**: 单行注释`--`或多行注释`/* */`。 - **PL/SQL代码编码...
`LISTAGG`是Oracle 11g版本引入的新功能,它允许我们对分组后的数据进行聚合,将同一组内的多行数据合并成单行,并以指定的分隔符连接。例如,假设我们有一个`employees`表,包含`employee_id`和`department`字段,...
Oracle管道函数是一种特殊类型的函数,它允许将单行数据转换为多行输出,这对于处理集合数据或进行数据分块操作非常有用。在Oracle数据库中,管道函数通过将数据流式传输到结果集中来实现这一点,而不是一次性返回...
在使用SQL*Loader时,我们需要创建一个控制文件,该文件描述了数据文件的结构,包括字段的分隔符、数据类型、长度等信息。例如,如果我们有一个CSV文件,控制文件可能包含如何处理逗号分隔的数据的指令。 在实际...
- **分隔符**:语句间可以使用空格、回车或制表符分隔,以分号结束(Oracle)。 - **注释**:多行注释用`/*...*/`,单行注释用`--`(Oracle)。 2.2.2 数据类型 Oracle支持22种不同的SQL数据类型,其中包括: - ...
- **优点**: 简单易用,只需要设置列分隔符即可。 - **缺点**: 导出的数据格式可能会出现不一致性,尤其是在数据量较大时容易出现问题。 - **示例**: ```sql set colsep '|' set trimspool on set linesize ...
无论是单行注释还是多行注释,都能被恰当地格式化,使阅读者更容易理解代码的目的和功能。 3. **高亮显示**:SQL Pretty Printer V3.12支持语法高亮,可以突出显示关键字、函数、变量和其他重要元素,让代码在视觉...
NESTRING函数在Oracle中用于字符串处理,可能用于将字符数组转换为单个字符串,或者在特定分隔符下拆分字符串。 这些是PL/SQL和Oracle教程中的基础概念,对于软件开发人员来说,理解和掌握这些内容是至关重要的,...
这份"Oracle Note"涵盖了从安装Oracle数据库到基本SQL语法、备份以及集群的相关知识,是初学者入门的良好资料。 首先,我们来看看Oracle数据库的启动和环境配置。在Day 1的笔记中提到了如何查找Oracle进程并确定SID...