Если вы знаете все возможные таблицы и все возможные столбцы, которые могут содержать table1, вы можете построить запрос с case when
, содержащим все возможности.Примерно так:
select id, subtable, subtable_column,
case
when subtable = 'branches' and subtable_column = 'branch_name' then
(select listagg(branch_name, ', ') within group (order by branch_name)
from branches)
when subtable = 'branches' and subtable_column = 'id' then
(select listagg(id, ', ') within group (order by id)
from branches)
end as subtable_values
from table1;
Но более распространенным решением для таких проблем является использование динамического SQL.Поэтому напишите такую функцию, как здесь:
create or replace function get_subtable_values(i_table in varchar2, i_column in varchar2)
return varchar2 is
v_sql varchar2(32767);
v_ret varchar2(32767);
begin
if i_table is null then
return null;
end if;
v_sql := 'select listagg('||i_column||', '', '') within group (order by null) from '||i_table;
execute immediate v_sql into v_ret;
return v_ret;
end;
... и используйте ее в запросе:
select id, subtable, subtable_column,
get_subtable_values(subtable, subtable_column) as subtable_values
from table1;
Мои тестовые данные и выходные данные для обоих запросов:
create table table1(id, subtable, subtable_column) as (
select 1, 'branches', 'branch_name' from dual union all
select 2, 'branches', 'id' from dual union all
select 3, null, null from dual);
create table branches(id, branch_name) as (
select 1, 'New York' from dual union all
select 2, 'Colombo' from dual );
Результат:
ID SUBTABLE SUBTABLE_COLUMN SUBTABLE_VALUES
------ -------- --------------- --------------------
1 branches branch_name Colombo, New York
2 branches id 1, 2
3 null null null
Я использовал функцию listagg()
, которая склеивает все значения в одну строку через запятую.Также возможно вернуть таблицу varchars или пользовательских типов.Конечно, может быть много проблем, таких как слишком длинные строки, типы данных, отличные от varchar, исключения должны обрабатываться и т. Д. Но вы видите, что это возможно.