oracle行列轉換-字串轉換成多列

pwz1688發表於2014-01-06
有表t_col_str,資料如下:

點選(此處)摺疊或開啟

  1. SQL> select * from t_str_col;

  2.         ID C123
  3. ---------- --------------------

  4.          1 v11,v21,v31
  5.          2 v12,v22,
  6.          3 v13,,v33
  7.          4 ,v24,v34
  8.          5 v15,,
  9.          6 ,,v35
  10.          7 ,,

  11. 已選擇7行。

現要將表中c123列,根據逗號,拆分成多列。
1)substr + instr
適用範圍:8i,9i,10g及以後版本

點選(此處)摺疊或開啟

  1. SQL> SELECT id,
  2.   2 c123,
  3.   3 substr(c123, 1, instr(c123 || ',', ',', 1, 1) - 1) c1,
  4.   4 substr(c123,
  5.   5 instr(c123 || ',', ',', 1, 1) + 1,
  6.   6 instr(c123 || ',', ',', 1, 2) - instr(c123 || ',', ',', 1, 1) - 1) c2,
  7.   7 substr(c123,
  8.   8 instr(c123 || ',', ',', 1, 2) + 1,
  9.   9 instr(c123 || ',', ',', 1, 3) - instr(c123 || ',', ',', 1, 2) - 1) c3
  10.  10 FROM t_str_col
  11.  11 ORDER BY 1;

  12.         ID C123 C1 C2 C3
  13. ---------- ------------------------------ ---------- ---------- ----------

  14.          1 v11,v21,v31 v11 v21 v31
  15.          2 v12,v22, v12 v22
  16.          3 v13,,v33 v13 v33
  17.          4 ,v24,v34 v24 v34
  18.          5 v15,, v15
  19.          6 ,,v35 v35
  20.          7 ,,

  21. 已選擇7行。
注:上面程式碼可簡化為下面格式:

點選(此處)摺疊或開啟

  1. SQL> edit
  2. 已寫入 file afiedt.buf

  3.   1 SELECT id,
  4.   2 c123,
  5.   3 substr(c123, 1, instr(c123, ',', 1, 1) - 1) c1,
  6.   4 substr(c123,
  7.   5 instr(c123, ',', 1, 1) + 1,
  8.   6 instr(c123, ',', 1, 2) - instr(c123, ',', 1, 1) - 1) c2,
  9.   7 substr(c123,
  10.   8 instr(c123, ',', 1, 2) + 1) c3
  11.   9 FROM t_str_col
  12.  10* ORDER BY 1
  13. SQL> /

  14.         ID C123 C1 C2 C3
  15. ---------- ------------------------------ ---------- ---------- ----------

  16.          1 v11,v21,v31 v11 v21 v31
  17.          2 v12,v22, v12 v22
  18.          3 v13,,v33 v13 v33
  19.          4 ,v24,v34 v24 v34
  20.          5 v15,, v15
  21.          6 ,,v35 v35
  22.          7 ,,

  23. 已選擇7行。

  24. SQL>

2)regexp_substr
適用範圍:10g及以後版本

點選(此處)摺疊或開啟

  1. SQL> SELECT id,
  2.   2 c123,
  3.   3 rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 1), ',') AS c1,
  4.   4 rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 2), ',') AS c2,
  5.   5 rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 3), ',') AS c3
  6.   6 FROM t_str_col
  7.   7 ORDER BY 1;

  8.         ID C123 C1 C2 C3
  9. ---------- ------------------------------ ---------- ---------- ----------

  10.          1 v11,v21,v31 v11 v21 v31
  11.          2 v12,v22, v12 v22
  12.          3 v13,,v33 v13 v33
  13.          4 ,v24,v34 v24 v34
  14.          5 v15,, v15
  15.          6 ,,v35 v35
  16.          7 ,,

  17. 已選擇7行。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21251711/viewspace-1067535/,如需轉載,請註明出處,否則將追究法律責任。

相關文章