繁体   English   中英

如何将列拆分为行 Oracle sql?

[英]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>

如果amountcdate列没有相同数量的值,您可能会遇到问题。 如果是这样,那么为什么要将多个值存储到一列中? 阅读规范化并 - 如果可能 - 更改数据模型。

小提琴演示

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM