Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
select
hw.actress, h.h as husband, case when h.h is not null then h.n end as husb_no
from hollywood hw,
rows from (
regexp_split_to_table(husbands, E'\\s*,\\s*'),
nullif(id, null)
) with ordinality h (h, x, n)
order by hw.id, h.n;
select
hw.actress,
h.h as husband,
-- Выводятся номера только для тех строк, которые сформированы с помощью regexp_split_to_table
case when h.h is not null then h.n end as husb_no
from hollywood hw,
-- ROWS FROM позволяет комбинировать результаты работы нескольких функций
rows from (
-- Функция разбивает столбец husbands по запятой (попутно удаляя все пробелы по обе стороны запятой),
-- выводя каждый фрагмент отдельной строкой. При этом для строк с husbands is null ничего не выводится.
-- E'...' - строка, "заэскейпленная" в стиле C
regexp_split_to_table(husbands, E'\\s*,\\s*'),
-- Функция используется, чтобы сохранить в выводе строки с husbands is null (ликвидирует дискриминацию Шарлиз)
-- Просто возвращает id, если он не null, что гарантирует наличие в выводе всех строк исходной таблицы
nullif(id, null)
-- Нумерует строки, получаемые из ROWS FROM
-- Нумерация начинается с начала (с 1) для каждой строки исходной таблицы
) with ordinality
-- Задается алиас для результатов конструкции ROWS FROM
h (h, x, n)
order by hw.id, h.n;
Перед использованием rownum рекомендуется делать order by во избежание косангенса в данных при дальнейших манипуляциях. Эт так, заметка на будущее :)
Oracle, типичные задачи SQL. Трансформация перечисленных в колонке значений в строки таблицы