查看: 12601|回复: 8

[笔记] 刚发现的利用SYS.ODCIVARCHAR2LIST进行列转行

[复制链接]
论坛徽章:
6
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512010广州亚运会纪念徽章:曲棍球
日期:2010-12-06 10:59:282011新春纪念徽章
日期:2011-02-18 11:43:34双黄蛋
日期:2011-07-15 10:33:56灰彻蛋
日期:2011-08-15 16:23:02ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51
跳转到指定楼层
1#
发表于 2010-9-8 14:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
众大牛们已经总结了行列转换的若干方法。今天发现了一种新的方法( ),和大家分享下。
1.SYS.ODCIVARCHAR2LIST:
SELECT COLUMN_VALUE  FROM TABLE(SYS.ODCIVARCHAR2LIST('1','2','3','4','5'));
COLUMN_VALUE
--------------------------------------------------------------------------------
1
2
3
4
5
Oracle 10G 以上版本才支持SYS.ODCIVARCHAR2LIST,其实SYS.ODCIVARCHAR2LIST只不过是一个TYPE,
所以在9I版本中可以通过创建一个TYPE来使用该功能:
CREATE OR REPLACE TYPE MY_ODCIVARCHAR2LIST AS VARRAY(32767) OF VARCHAR2(4000);

SELECT COLUMN_VALUE  FROM TABLE(MY_ODCIVARCHAR2LIST('1','2','3','4','5'));
COLUMN_VALUE
--------------------------------------------------------------------------------
1
2
3
4
5
但是,当'1','2','3','4','5'  作为一个字符串('1,2,3,4,5')就没有办法转换了:
SELECT COLUMN_VALUE  FROM TABLE(MY_ODCIVARCHAR2LIST('1,2,3,4,5'));
COLUMN_VALUE
--------------------------------------------------------------------------------
1,2,3,4,5

总结:(1)Table函数将数组里的内容通过SQL语句查询出来;
      (2)ODCIVARCHAR2LIST 在9I 及以上版本中均可使用。在9I中可通过创建TYPE,10G及以上直接使用SYS.ODCIVARCHAR2LIST;
      (3)ODCIVARCHAR2LIST 适用于字符集,不适用单个字符串,如果是单个字符串,可以通过参考2中(如下)方法实现。

欢迎大家讨论,提出更多更好的方法~~

参考----------------------------------------------------------------
2.其他方法实现列转行(大牛们早已经总结,仅供参考)
(1) 利用CONNECT BY (使用9I,10G,11G)
WITH T AS (SELECT  '1,2,3,4,5' AS STR FROM DUAL)
SELECT  STR1  
FROM ( SELECT  DISTINCT
                SUBSTR(T.CA,INSTR(T.CA, ',', 1, C.LV) + 1,
                       INSTR(T.CA, ',', 1, C.LV + 1) -(INSTR(T.CA, ',', 1, C.LV) + 1)) AS STR1
       FROM (SELECT ',' || STR || ',' AS CA,LENGTH(STR || ',') -NVL(LENGTH(REPLACE(STR, ',')), 0) AS CNT FROM T) T,
            (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 9) C
       WHERE C.LV <= T.CNT
       ORDER BY STR1);
(2).正则表达式(使用10G及以上版本)
WITH TEST AS (SELECT  '1,2,3,4,5' AS STR FROM DUAL)
SELECT DISTINCT REGEXP_SUBSTR(STR, '[^,]+', 1, LEVEL)
FROM TEST
CONNECT BY ROWNUM <= 5;

[ 本帖最后由 cj402444206 于 2010-9-8 16:02 编辑 ]
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
2#
发表于 2010-9-8 15:36 | 只看该作者
这个三思几年前就发现了

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
3#
发表于 2010-9-8 15:38 | 只看该作者
这东西用起来可不可靠, 是不是在官方文档上公布呢?

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
4#
发表于 2010-9-8 15:39 | 只看该作者
原帖由 bell6248 于 2010-9-8 15:38 发表
这东西用起来可不可靠, 是不是在官方文档上公布呢?

明显不是,呵呵

使用道具 举报

回复
论坛徽章:
1
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:52
5#
发表于 2010-9-8 16:09 | 只看该作者
学习一下

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
6#
发表于 2010-9-8 22:07 | 只看该作者
没啥用,因为不能用绑定变量。

使用道具 举报

回复
论坛徽章:
12
7#
发表于 2010-9-9 08:07 | 只看该作者
对呀 感觉用处不大 还是用'[^,]+'

使用道具 举报

回复
论坛徽章:
0
8#
发表于 2019-4-9 10:35 | 只看该作者
9年的帖子了

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
9#
发表于 2019-4-10 03:17 | 只看该作者
SYS.ODCIVARCHAR2LIST 就是一个预定义的 VARRAY而已,你要对它初始化就要先有一系列数组元素,它并不会替你执行任何字符串拆分的工作。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表