oracle split去逗号,行列转换
来源:互联网 发布:农村淘宝生产投入制度 编辑:程序博客网 时间:2024/06/05 15:32
1.针对 '1','2','3','4','5'(逗号在字符串外面)
SQL> SELECT COLUMN_VALUE FROM TABLE(SYS.ODCIVARCHAR2LIST('1','2','3','4','5'));COLUMN_VALUE--------------------------------------------------------------------------------12345
2.针对'1,2,3,4,5'(逗号在字符串里面)
SQL> select regexp_substr('1,2,3,4,5','[^,]+',1,rownum) from dual 2 connect by rownum<=length('1,2,3,4,5')-length(replace('1,2,3,4,5',','))+1 3 ;REGEXP_SUBSTR('1,2,3,4,5','[^,------------------------------12345
3.使用函数
CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
CREATE OR REPLACE FUNCTION fn_split (p_str IN CLOB, p_delimiter IN VARCHAR2) RETURN ty_str_splitIS j INT := 0; i INT := 1; len INT := 0; len1 INT := 0; str VARCHAR2 (4000); str_split ty_str_split := ty_str_split ();BEGIN len := LENGTH (p_str); len1 := LENGTH (p_delimiter); WHILE j < len LOOP j := INSTR (p_str, p_delimiter, i); IF j = 0 THEN j := len; str := SUBSTR (p_str, i); str_split.EXTEND; str_split (str_split.COUNT) := str; IF i >= len THEN EXIT; END IF; ELSE str := SUBSTR (p_str, i, j - i); i := j + len1; str_split.EXTEND; str_split (str_split.COUNT) := str; END IF; END LOOP; RETURN str_split;END fn_split;
测试:
SQL> select * from table(fn_split('1,2,3,4,5',',')); --第二个单引号中是前面字符串中需要被分隔的字符COLUMN_VALUE--------------------------------------------------------------------------------12345SQL> select * from table(fn_split('1,2,3,4。5','。'));COLUMN_VALUE--------------------------------------------------------------------------------1,2,3,45
参考:
http://www.itpub.net/thread-1346178-1-1.html
众大牛们已经总结了行列转换的若干方法。今天发现了一种新的方法( ),和大家分享下。1.SYS.ODCIVARCHAR2LIST:
SELECT COLUMN_VALUE FROM TABLE(SYS.ODCIVARCHAR2LIST('1','2','3','4','5'));COLUMN_VALUE--------------------------------------------------------------------------------12345
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--------------------------------------------------------------------------------12345
但是,当'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 TESTCONNECT BY ROWNUM <= 5;
转载自:http://blog.csdn.net/wanglilin/article/details/7231712
0 0
- oracle split去逗号,行列转换
- oracle split去逗号,行列转换
- oracle split去逗号,行列转换
- oracle split去逗号,行列转换
- oracle split去逗号,行列转换
- oracle split去逗号,行列转换
- MySQL逗号分割字段的行列转换
- ORACLE行列转换实例
- oracle 行列转换
- 行列转换 oracle
- ORACLE DB行列转换
- oracle行列转换总结
- oracle 行列转换
- 关于oracle行列转换
- oracle 实现行列转换
- oracle行列转换总结
- Oracle 行列转换 总结
- oracle行列转换总结
- filter,interceptor, 他们之间有什么区别
- 关于java多线程的一些知识
- TopCoder 规则入门
- memcpy与memmove 的区别
- Python中使用PyHook监听鼠标和键盘事件实例
- oracle split去逗号,行列转换
- Smallest subarray with sum greater than a given value
- Selec函数
- 操作系统结构(二)
- iOS工具种之16进制颜色转为UIColor
- SpringMVC的ViewResolver
- java根据IP获取用户所在地
- 在网站建设类型中 最常见的几个建站类型
- Windows7下安装和配置Python3+Eric5+Pyqt4的开发环境