Есть следующая проблема:
1. запись в таблице бд содержит несколько значений(колонок), которые могут быть null.
2. в результирующую выборку должно попасть n-строк по каждой записи в таблице, где n — количество not null значений.
строка результата содержит еще дополнительные данные, которые нужно будет доставлять "хардкодом" к некоторым значениям.
Реально ли так вытянуть данные SQL-запросом? Или может ли кто-нибудь подсказать, как это сделать на PLSQL?
Спасибо.
P.S.: изменить структуру или требуемый результат выборки не представляется возможным.
Re: Oracle 11 SQL. Одна строка в таблице => несколько строк в результате
Допустим значения a,d,e — заполнены, b,c — null, тогда результат выборки должен выглядеть:
a, sa1, sc2
d, sd1, sd2
e, se1, se2
Где s** — или некоторые константы, которые будут обрабатываться в запросе выше или в коде, или какие-либо значения, которые будут подтягиваться подзапросами. Получается, если не заполнено ничего, в выборку по этой строке таблицы не должно попасть ничего, иначе — по одной строке на каждое значение.
Re: Oracle 11 SQL. Одна строка в таблице => несколько строк в результате
От:
Аноним
Дата:
08.11.13 21:39
Оценка:
Здравствуйте, DeathKnight, Вы писали:
DK>Реально ли так вытянуть данные SQL-запросом? Или может ли кто-нибудь подсказать, как это сделать на PLSQL? DK>P.S.: изменить структуру или требуемый результат выборки не представляется возможным.
Задачу понял смутно, но есть чувство, что здесь поможет PIVOT
Re[3]: Oracle 11 SQL. Одна строка в таблице => несколько строк в результате
Здравствуйте, DeathKnight, Вы писали:
DK>Получается, если не заполнено ничего, в выборку по этой строке таблицы не должно попасть ничего, иначе — по одной строке на каждое значение.
with cols as (
select 'a' col from dual
union all select 'b' from dual
union all select 'c' from dual
union all select 'd' from dual
union all select 'e' from dual
)
select t.row_id
, cols.col
, case cols.col
when 'a' then t.a
when 'b' then t.b
when 'c' then t.c
when 'd' then t.d
when 'e' then t.e
end as val
from t, cols
where
case cols.col
when 'a' then t.a
when 'b' then t.b
when 'c' then t.c
when 'd' then t.d
when 'e' then t.e
end is not null
order by row_id, col
Здравствуйте, Olaf, Вы писали:
O>Здравствуйте, Аноним, Вы писали:
А>>Задачу понял смутно, но есть чувство, что здесь поможет PIVOT
O>Если быть точным, то Unpivot преобразует столбцы данных в строки O>
O>select row_id, col, value
O>from
O>(
O> select *
O> from t
O>) unpivot(value for col in (a, b, c, d, e))
O>order by row_id, value
O>