две таблицы и в зависимости от условия надо сделать либо full join, либо union...
create or replace function st_entity_api.entity_type_get(
p_user_id uuid,
p_trans_id uuid DEFAULT NULL::uuid,
p_state_code varchar[],
p_entity_type_id uuid[] DEFAULT NULL::uuid[],
p_entity_type_code varchar[] DEFAULT NULL::uuid[]
p_profile_id uuid DEFAULT NULL::uuid,
p_is_state_merge boolean default false
)
returns table(oper_type_code varchar, entity_type_id uuid, name character varying, code character varying)
language plpgsql
stable security definer parallel safe
as $$
begin
if p_is_state_merge then
return query
with te as (
select * from st_entity.trans_entity_type
where trans_id = p_trans_id
and state_code = any(p_state_code)
and (p_entity_type_id is null or entity_type_id = any(p_entity_type_id))
and (p_entity_type_code is null or code = any(p_entity_type_code))
), e as (
select * from st_entity.entity_type
where state_code = any(p_state_code)
and (p_entity_type_id is null or entity_type_id = any(p_entity_type_id))
and (p_entity_type_code is null or code = any(p_entity_type_code))
)
select
coalesce(e.id, te.entity_type_id) as entity_type_id,
te.oper_type_code,
st_core.defval(te.id, te.state_code, e.state_code) as state_code,
st_core.defval(te.id, te.name, e.name) as name,
st_core.defval(te.id, te.code, e.code) as code
from e
full join te on e.id = te.entity_type_id;
else
return query
with te as (
select * from st_entity.trans_entity_type
where trans_id = p_trans_id
and state_code = any(p_state_code)
and (p_entity_type_id is null or entity_type_id = any(p_entity_type_id))
and (p_entity_type_code is null or code = any(p_entity_type_code))
), e as (
select * from st_entity.entity_type
where state_code = any(p_state_code)
and (p_entity_type_id is null or entity_type_id = any(p_entity_type_id))
and (p_entity_type_code is null or code = any(p_entity_type_code))
)
select
e.id as entity_type_id,
null::varchar as oper_type_code,
e.state_code,
e.name,
e.code
from e
union all
select
te.entity_type_id,
te.oper_type_code,
te.state_code,
te.name,
te.code
from te;
end if;
end;
$$;
Если сохранить условия задачи, то нет, нельзя
Я бы несоветовал. Попытки сделать один запрос -- скорее всего приведут к тому, что планировщику или труднее будет кэшыровать планы или ему придётся делать какой-то усреднённый план, что можэт быть заметно медленнее.
Можно CTE-шки te и e запихать во временные таблицы прям внутри функции, и работать уже с ними. Код станет компактнее, но как на скорости скажется не знаю :)
Обсуждают сегодня