oracle行列转换-字符串转换成多列

有表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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21251711/viewspace-1067535/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值