1.针对 '1','2','3','4','5'(逗号在字符串外面)
SQL> SELECT COLUMN_VALUE FROM TABLE(SYS.ODCIVARCHAR2LIST('1','2','3','4','5')); COLUMN_VALUE -------------------------------------------------------------------------------- 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','[^, ------------------------------ 1 2 3 4 5
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_split IS 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 -------------------------------------------------------------------------------- 1 2 3 4 5 SQL> select * from table(fn_split('1,2,3,4。5','。')); COLUMN_VALUE -------------------------------------------------------------------------------- 1,2,3,4 5
参考:
http://www.itpub.net/thread-1346178-1-1.html
众大牛们已经总结了行列转换的若干方法。今天发现了一种新的方法(SELECT COLUMN_VALUE FROM TABLE(SYS.ODCIVARCHAR2LIST('1','2','3','4','5')); COLUMN_VALUE -------------------------------------------------------------------------------- 1 2 3 4 5
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
SELECT COLUMN_VALUE FROM TABLE(MY_ODCIVARCHAR2LIST('1,2,3,4,5')); COLUMN_VALUE -------------------------------------------------------------------------------- 1,2,3,4,5
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);
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;
转载自:http://blog.csdn.net/wanglilin/article/details/7231712