Разделить значения, разделенные запятыми, на несколько строк - Oracle SQL - PullRequest
0 голосов
/ 22 апреля 2019

у меня есть стол

table1

TEST_TYPE                   H_LEVEL                     HADOOP
22RETGGEDGDD, RRMMNFNEDGDD  Control Directory 1         Interchange Control Header
22RETGGEDGDD, RRMMNFNEDGDD  Control Directory 2         Interchange Control Header
22RETGGEDGDD, RRMMNFNEDGDD  Control Directory 3         Interchange Control Header

Я знаю, как разделять значения в столбцах через запятую, но я не знаю, как разделять значения в строках при копировании всех остальных столбцов следующим образом.

table2

TEST_TYPE           H_LEVEL                     HADOOP
22RETGGEDGDD        Control Directory 1         Interchange Control Header
RRMMNFNEDGDD        Control Directory 1         Interchange Control Header
22RETGGEDGDD        Control Directory 2         Interchange Control Header
RRMMNFNEDGDD        Control Directory 2         Interchange Control Header
22RETGGEDGDD        Control Directory 3         Interchange Control Header
RRMMNFNEDGDD        Control Directory 3         Interchange Control Header

Как я могу сделать это в Oracle SQL?

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Вот один из вариантов; вам нужны строки 6 и далее.

SQL> with table1 (test_type, h_level, hadoop) as
  2    (select '22RETGGEDGDD, RRMMNFNEDGDD', 'Control Directory 1', 'Interchange Control Header' from dual
  3     union all
  4     select '22RETGGEDGDD, RRMMNFNEDGDD', 'Control Directory 2', 'Interchange Control Header' from dual
  5    )
  6  select trim(regexp_substr(test_type, '[^,]+', 1, column_value)) test_type,
  7         h_level,
  8         hadoop
  9  from table1 join table(cast(multiset(select level from dual
 10                                       connect by level <= regexp_count(test_type, ',') + 1
 11                                      ) as sys.odcinumberlist )) on 1 = 1
 12  order by 2, 1 desc, 3;

TEST_TYPE            H_LEVEL             HADOOP
-------------------- ------------------- --------------------------
22RETGGEDGDD         Control Directory 1 Interchange Control Header
RRMMNFNEDGDD         Control Directory 1 Interchange Control Header
22RETGGEDGDD         Control Directory 2 Interchange Control Header
RRMMNFNEDGDD         Control Directory 2 Interchange Control Header

SQL>
0 голосов
/ 22 апреля 2019

Вы можете использовать cross join

with t(test_type, h_level, hadoop) as
(
 select '22RETGGEDGDD, RRMMNFNEDGDD','Control Directory 1','Interchange Control Header' 
   from dual union all
 select '22RETGGEDGDD, RRMMNFNEDGDD','Control Directory 2','Interchange Control Header' 
   from dual union all
 select '22RETGGEDGDD, RRMMNFNEDGDD','Control Directory 3','Interchange Control Header' 
   from dual  
)    
select distinct regexp_substr(test_type,'[^, ]+', 1, level ) as test_type, 
                t2.h_level, t2.hadoop
  from t t1
 cross join ( select h_level, hadoop from t ) t2
 connect by level <= regexp_count(test_type,',' ) + 1
   order by t2.h_level, test_type desc;

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...