2016-07-28 7 views
1

Допустим, моя таблица выглядит следующим образом:Разделить столбец на два или более в Oracle

------------------------- 
| id | prop    | 
------------------------- 
| 1 | Jhon_Dhoe_21  | 
------------------------- 
| 2 | Tom_Dohn_23_MALE | 
------------------------- 
| 3 | Scot    | 
------------------------- 

свойства всегда будет разделен на «_». Таким образом, после выбора таблица должна выглядеть следующим образом:

-------------------------------------- 
| id | prop1 | prop2 | prop3 | prop4 | 
-------------------------------------- 
| 1 | Jhon | Dhoe | 21 | NULL | 
-------------------------------------- 
| 2 | Tom | Dohn | 23 | MALE | 
-------------------------------------- 
| 3 | Scot | NULL | NULL | NULL | 
-------------------------------------- 

Теперь, если мы знаем, что максимальное количество свойств (п), что мы могли бы я полагаю, мы можем создать п числа регулярных выражений как выражения над опоры колонка или что-то еще. Но если мы не знаем, возможно, нам нужно сначала найти строку с большинством объектов?

EDIT:

Я не могу принять несколько строк.

+2

SQL-запрос может возвращает фиксированный набор столбцов. Если вам требуется переменное количество столбцов, вам нужно использовать динамический SQL или альтернативную структуру данных (например, вложенные таблицы или JSON). –

+0

@GordonLinoff Я вижу .. спасибо Гордон. Я буду исследовать динамическое использование SQL, возможно, для него это окончательно. –

+0

Если вы можете принять несколько строк для каждого 'id', то это возможное решение: http://stackoverflow.com/questions/14328621/splitting-string-into-multiple-rows-in-oracle. –

ответ

2

это был интересный вопрос, так что я решил это так:

with 
    tbl as (
    select 1 id, 'Jhon_Dhoe_21' prop from dual union all 
    select 2 id, 'Tom_Dohn_23_MALE' prop from dual union all 
    select 3 id, 'Scot' prop from dual 
), 
    maxrows as (select level rn from dual connect by level <= 100) 
select id, regexp_substr(t.prop, '[^_]+', 1, mr.rn) prop_rn, rn, prop 
from tbl t, maxrows mr 
where mr.rn <= regexp_count(t.prop, '\_') + 1 
order by id, rn 

Результаты:

 ID PROP_RN     RN PROP 
---------- ---------------- ---------- ---------------- 
     1 Jhon      1 Jhon_Dhoe_21 
     1 Dhoe      2 Jhon_Dhoe_21 
     1 21      3 Jhon_Dhoe_21 
     2 Tom      1 Tom_Dohn_23_MALE 
     2 Dohn      2 Tom_Dohn_23_MALE 
     2 23      3 Tom_Dohn_23_MALE 
     2 MALE      4 Tom_Dohn_23_MALE 
     3 Scot      1 Scot 

8 rows selected 

Если вы знаете (или точно) максимально возможных столбцов, которые можно использовать :

with 
    tbl as (
    select 1 id, 'Jhon_Dhoe_21' prop from dual union all 
    select 2 id, 'Tom_Dohn_23_MALE' prop from dual union all 
    select 3 id, 'Scot' prop from dual 
), 
    maxrows as (select level rn from dual connect by level <= 100), 
    tbl2 as (
    select id, regexp_substr(t.prop, '[^_]+', 1, mr.rn) prop_rn, rn, prop 
    from tbl t, maxrows mr 
    where mr.rn <= regexp_count(t.prop, '\_') + 1 
    order by id, rn) 
select * 
from tbl2 
pivot (
    max(prop_rn) 
    for rn in (1,2,3,4,6,7,8,9,10) 
) 

Результат:

 ID PROP    1    2    3    4    6    7    8    9    10 
---------- ---------------- ---------------- ---------------- ---------------- ---------------- ---------------- ---------------- ---------------- ---------------- ---------------- 
     1 Jhon_Dhoe_21  Jhon    Dhoe    21                          
     3 Scot    Scot                                  
     2 Tom_Dohn_23_MALE Tom    Dohn    23    MALE                     

SQL> 

Или используйте XMLType:

with 
    tbl as (
    select 1 id, 'Jhon_Dhoe_21' prop from dual union all 
    select 2 id, 'Tom_Dohn_23_MALE' prop from dual union all 
    select 3 id, 'Scot' prop from dual 
), 
    maxrows as (select level rn from dual connect by level <= 100), 
    tbl2 as (
    select id, regexp_substr(t.prop, '[^_]+', 1, mr.rn) prop_rn, rn, prop 
    from tbl t, maxrows mr 
    where mr.rn <= regexp_count(t.prop, '\_') + 1 
    order by id, rn) 
select * 
from tbl2 
pivot xml (
    max(prop_rn) prp 
    for rn in (any) 
) 
+0

Да, это возможное решение, но я не могу принять несколько строк, если бы мог, конечно, это сработало. –

+0

Вам нужны только столбцы? Я спрашиваю об этом, потому что использование динамического sql - это не лучший способ ... Возможно, xmltype? – saphsys

+0

Да Я могу развернуть по столбцам не по строкам –