2015-05-04 62 views
0

轉換我有一個像下面排在Oracle SQL

1,a,b,c 
2,d,e 
3,f,g 

預計輸出

1 a 
1 b 
1 c 
2 d 
2 e     

能否請你幫我值?

+2

可能重複(HTTP://計算器。 com/questions/14328621/splitting-string-into-multiple-rows-in-oracle) – Mat

+0

不是純粹的複製但是,因爲它不僅僅是將分隔的值分割成行,而是在單獨的列中重複前面的substr值。大多數情況下邏輯保持不變,但是,需要額外的規則來消除重複行,正如我在答案中所解釋的。 –

回答

2

這對於執行Split comma delimited strings in a table邏輯非常接近。唯一棘手的是你有行號和字符串本身。

你可以使用ROWNUM僞列,然後過濾掉那些字符串的領先SUBSTR與ROWNUM重複行。

例如,

設置

SQL> CREATE TABLE t(text VARCHAR2(4000)); 

Table created. 

SQL> 
SQL> INSERT INTO t SELECT '1,a,b,c' text FROM dual; 

1 row created. 

SQL> INSERT INTO t SELECT '2,d,e' text FROM dual; 

1 row created. 

SQL> INSERT INTO t SELECT '3,f,g' text FROM dual; 

1 row created. 

SQL> COMMIT; 

Commit complete. 

SQL> 
SQL> SELECT * FROM t; 

TEXT 
---------- 
1,a,b,c 
2,d,e 
3,f,g 

SQL> 

溶液:分割字符串轉換成多行中的Oracle]的

SQL> WITH DATA AS(
    2 SELECT ROWNUM rn, text FROM t 
    3 ) 
    4 SELECT * 
    5 FROM 
    6 (SELECT rn, 
    7  trim(regexp_substr(t.text, '[^,]+', 1, lines.COLUMN_VALUE)) text 
    8 FROM DATA t, 
    9  TABLE (CAST (MULTISET 
10  (SELECT LEVEL FROM dual CONNECT BY LEVEL <= regexp_count(t.text, ',')+1 
11  ) AS sys.odciNumberList)) lines 
12 ) 
13 WHERE TO_CHAR(rn) <> text 
14 ORDER BY rn 
15/

     RN TEXT 
---------- ---------- 
     1 a 
     1 b 
     1 c 
     2 d 
     2 e 
     3 f 
     3 g 

7 rows selected. 

SQL> 
+0

嗨,lalit謝謝你,但是很難理解,有沒有簡單的查詢 – Rajesh123

+0

@ Rajesh123好了,如果你瞭解REGEXP_SUBSTR,ROW_GENERATOR方法就不會有困難。可能你需要做一些學習和測試。谷歌周圍的關鍵字我告訴你。 –