[英]How to split column into rows Oracle sql?
我有一个表格,我需要将两列分成几行
例如:表名:MY_TABLE_FILE
ref_no cus_no amount date
AA1 123 325000,200000,317085,2657915 20190522,20190405,20190402,20190322
AA2 265 1000000,1500000 20190125,20190102
AA3 457 475000 20190101
预期产出
ref_no cus_no amount date
AA1 123 325000 20190522
AA1 123 200000 20190405
AA1 123 317085 20190402
AA1 123 2657915 20190322
AA2 265 1000000 20190125
AA2 265 1500000 20190102
AA3 457 475000 20190101
我试过的代码
SELECT ref_no,cus_no,
trim(regexp_substr(amount, '[^,]+',1,LEVEL)),
trim(regexp_substr(date, '[^,]+', 1,LEVEL))
FROM MY_TABLE_FILE
CONNECT BY LEVEL <= regexp_count(amount, ',')+1
但我没有得到输出,如果你能帮助解决代码,不胜感激
就是这样:
SQL> with my_table_file (ref_no, cus_no, amount, cdate) as
2 (select 'AA1', 123, '325000,200000,317085,2657915',
3 '20190522,20190405,20190402,20190322'
4 from dual union all
5 select 'AA2', 265, '1000000,1500000',
6 '20190125,20190102'
7 from dual
8 )
9 select ref_no,
10 cus_no,
11 regexp_substr(amount, '[^,]+', 1, column_value) amount,
12 regexp_substr(cdate , '[^,]+', 1, column_value) cdate
13 from my_table_file cross join
14 table(cast(multiset(select level from dual
15 connect by level <= regexp_count(amount, ',') + 1
16 ) as sys.odcinumberlist))
17 order by ref_no, cus_no, column_value;
REF CUS_NO AMOUNT CDATE
--- ---------- ---------- ----------
AA1 123 325000 20190522
AA1 123 200000 20190405
AA1 123 317085 20190402
AA1 123 2657915 20190322
AA2 265 1000000 20190125
AA2 265 1500000 20190102
6 rows selected.
SQL>
如果amount
和cdate
列没有相同数量的值,您可能会遇到问题。 如果是这样,那么为什么要将多个值存储到一列中? 阅读规范化并 - 如果可能 - 更改数据模型。
SELECT distinct ref_no, cus_no,
trim(regexp_substr(amount, '[^,]+', 1, level)) amount,
trim(regexp_substr(dater, '[^,]+', 1, level)) dater
FROM (SELECT ref_no,cus_no, amount,dater FROM TAB) t
CONNECT BY instr(amount, ',', 1, level - 1) > 0
ORDER BY ref_no
你可以加
AND PRIOR SYS_GUID() is not null
AND PRIOR ref_no = ref_no
部分取决于层次逻辑:
SELECT ref_no, cus_no,
trim(regexp_substr(amount, '[^,]+', 1, LEVEL)) as amount,
trim(regexp_substr("date", '[^,]+', 1, LEVEL)) as "date"
FROM MY_TABLE_FILE
CONNECT BY LEVEL <= regexp_count(amount, ',') + 1
AND PRIOR SYS_GUID() is not null
AND PRIOR ref_no = ref_no
ORDER BY ref_no, cus_no
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.