Как в Oracle SQL развернуть строку в столбец

Статьи про Oracle -> Программирование

Как в Oracle SQL развернуть строку в столбец

v:1.0 27.07.2014
Петрелевич Сергей

Давайте рассмотри пример преобразования данных SQL-запросом Oracle.
Создаем тестовую таблицу:

create table tTest
(
  id number,
  value varchar2(100)
);

--Вставляем в нее строку
insert into tTest(id,value) values(1,'value1;value2');
commit;

--Смотрим, что получилось:
select * from tTest;
--запрос вернул:
ID	Value
1	value1;value2
Допустим, что для какой-то цели нам надо извлечь данные из этой таблицы, не немного не в том виде, как они хранятся.
На надо развернуть строку в столбец, т.е. SQL-запрос вместо одной строки
value1;value2
должен вернуть две строки:
value1
value2
Сделать это можно таким запросом:
    select id, regexp_substr(t.value, '[^;]+', 1, level) vals
      from tTest t
     where t.id=1
   connect by level <= length(regexp_replace(t.value, '[^;]+')) + 1; 
Этот запрос вернет такой результат:
Id      vals
1	value1
1	value2
Это нам и надо.
Дополнительно стоит отметить, что в этом запросе используется резулярное выражение
[^;]+
т.е. все символы кроме ";" (используется как разделитель полей) и запрос генерации последовательности чисел.

Метки:

Комментарии.

Внимание.
Комментировать могут только зарегистрированные пользователи.
Возможно использование следующих HTML тегов: <a>, <b>, <i>, <br>.

Chalyshev 14.07.2015 15:32:25
Серега , вроде я это где то уже читал ) или писал , не помню уже ...
 
Chalyshev 14.07.2015 15:35:49
в вобще есть отличная книга по SQL Энтони Моллиаро SQL Сборник рецептов
 
Chalyshev 14.07.2015 16:05:20
считаю так же что в данном примере тема сисек раскрыта далеко не полностью ... select distinct id,level, regexp_substr(value, '[^;]+', 1, level) vals from ttest connect by regexp_substr(value, '[^;]+', 1, level) is not null; вот так полностью...