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 ответов

17 просмотров

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

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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта