172 похожих чатов

Привет! можно ли как-то красиво сократить эту городуху? вкратце есть

две таблицы и в зависимости от условия надо сделать либо 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;
$$;

3 ответов

6 просмотров

Если сохранить условия задачи, то нет, нельзя

Я бы несоветовал. Попытки сделать один запрос -- скорее всего приведут к тому, что планировщику или труднее будет кэшыровать планы или ему придётся делать какой-то усреднённый план, что можэт быть заметно медленнее.

Можно CTE-шки te и e запихать во временные таблицы прям внутри функции, и работать уже с ними. Код станет компактнее, но как на скорости скажется не знаю :)

Похожие вопросы

Обсуждают сегодня

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
Добрый день подскажите пожалуйста может кто то сталкивался с ошибками Sentry 22.10.0 развернутым из helm чарт в Kubernetes? Изначально 3 дня назад очень стало много событий ух...
Tire4 Finist Devops
1
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
почому оно не работает?
Vi Chapmann Chapmann
19
всем привет почти закончил курс После него можно писать свою операционку? Какие библиотеки надо использовать и куда дальше копать для изучения
Linus
19
Так а кто может спарсить всех участников чата? Идишники
Magic
18
Карта сайта