oracle 列转行(把一个表的所有列连成一行,用逗号分隔)

本文介绍了一种使用Oracle的WM_CONCAT函数轻松实现数据列转行的方法,适用于10g及以上版本。通过具体示例展示了如何将多列数据转换为一行,适用于tb_name(id,remark)表结构,通过GROUP BY和WM_CONCAT函数实现数据聚合。

从网上找了都是关于decode的方法实现的列转行,后来发现了用orcale的wmsys.wm_concat方法可以轻松的实现,下面的范例是网上找的:wmsys.wm_concat要10g以后才可以。

 表结构:

 1  A
 1  B
 1  C
 2  A
 2  B
 3  C
 3  F
 4  D
 转换后变成:     

 1  A,B,C
 2  A,B
 3  C,F
 4  D

      方法:

 假设你的表结构是tb_name(id, remark),则语句如下:

 SELECT 
   a.id,
   wm_concat (a.remark) new_result
 FROM 
 tb_name a
 group by 
 a.id
### Oracle 数据库中将数据换为以逗号分隔的行数据的方法 在 Oracle 数据库中,可以通过 SQL 查询实现将存储在一个字段内的逗号分隔字符串拆分为多行记录。这种方法适用于处理类似权限编号或其他由逗号分割的数据场景。 以下是具体的解决方案: #### 方法一:使用 `CONNECT BY` 和 `REGEXP_SUBSTR` 通过正则达式函数 `REGEXP_SUBSTR` 结合层次化查询 (`CONNECT BY`) 来实现转行逗号分隔的形式。此方法利用了 Oracle 的递归特性来逐一分割字符串中的每一部分。 ```sql WITH sample_data AS ( SELECT '1,2,3,4,5' AS column_with_commas FROM DUAL ) SELECT TRIM(REGEXP_SUBSTR(column_with_commas, '[^,]+', 1, LEVEL)) AS split_value FROM sample_data CONNECT BY LEVEL <= REGEXP_COUNT(column_with_commas, ',') + 1; ``` 这段代码的作用如下: - 使用 `REGEXP_SUBSTR` 提取逗号之间的子串[^1]。 - 层次化查询 `CONNECT BY` 控制提取的层数等于逗号的数量加一[^4]。 - `TRIM` 去除可能存在的多余空白字符[^2]。 --- #### 方法二:基于 XMLType 换 另一种方式是借助 Oracle 的 XML 功能,将逗号分隔的字符串化为 XML 格式的节点集合,再将其解析为单独的行。 ```sql WITH sample_data AS ( SELECT '1,2,3,4,5' AS column_with_commas FROM DUAL ) SELECT COLUMN_VALUE AS split_value FROM TABLE(XMLSequence(EXTRACT(XMLTYPE('<r><i>' || REPLACE(column_with_commas, ',', '</i><i>') || '</i></r>'), '/r/i'))) CROSS JOIN (SELECT * FROM sample_data); ``` 这里的逻辑分解为: - 将原始字符串替换为 XML 形式的标签结构 `<i>`[^3]。 - 使用 `XMLSequence` 解析 XML 并返回每一段作为独立的结果集[^4]。 --- #### 方法三:PL/SQL 自定义函数 对于复杂的业务需求,也可以编写一个 PL/SQL 函数来进行动态拆分操作。这种方式虽然灵活性更高,但在简单场景下不如纯 SQL 高效。 ```plsql CREATE OR REPLACE FUNCTION SPLIT_STRING(p_str IN VARCHAR2, p_delimiter IN VARCHAR2) RETURN SYS.ODCIVARCHAR2LIST PIPELINED IS l_string LONG := p_str || p_delimiter; l_index PLS_INTEGER; BEGIN LOOP l_index := INSTR(l_string, p_delimiter); EXIT WHEN NVL(l_index, 0) = 0; PIPE ROW(SUBSTR(l_string, 1, l_index - 1)); l_string := SUBSTR(l_string, l_index + LENGTH(p_delimiter)); END LOOP; END; / -- 测试调用 SELECT COLUMN_VALUE AS split_value FROM TABLE(SPLIT_STRING('1,2,3,4,5', ',')); DROP FUNCTION SPLIT_STRING; ``` 以上脚本创建了一个名为 `SPLIT_STRING` 的管道函数,它接受两个参数——待拆分的字符串以及分隔符,并逐步切割输入字符串并返回结果。 --- ### 性能对比与适用范围 三种方法各有优劣: - **方法一** 是最常用的方案之一,适合大多数情况下的静态或半静态数据处理。 - **方法二** 更适合需要跨平台兼容性的场合,尤其是当目标环境支持标准 XML 处理时[^3]。 - **方法三** 对于频繁使用的复杂逻辑更为合适,但由于涉及过程化编程,维护成本较高。 无论采用哪种技术路线,在实际应用前都应充分测试其性能现,尤其是在大数据量条件下验证执行计划是否合理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值