Задать вопрос
@firstmixon

Запрос с 1 условием для выбора источника данных?

День добрый!
а есть ли аналог следующему запросу:
SELECT 
CASE WHEN <условие> THEN t2.p_1 ELSE t1._p_1 END AS r1,
CASE WHEN <условие> THEN t2.p_2 ELSE t1._p_2 END AS r2,
..
CASE WHEN <условие> THEN t2.p_n ELSE t1._p_n END AS rn,
t3.*

FROM t1
LEFT JOIN t2 AS t2 ON t2.t1_id= t1.id
LEFT JOIN t3 AS t2 ON t3.t1_id= t1.id


что нибудь вида:
SELECT  if(<условие>)
(t2.p_1
,t2.p_2
...
t2.p_n
)
else
(t1.p_1
,t1.p_2
...
t1.p_n
)
,t3.*
FROM t1
LEFT JOIN t2 AS t2 ON t2.t1_id= t1.id
LEFT JOIN t3 AS t2 ON t3.t1_id= t1.id


Заранее спасибо за советы.
  • Вопрос задан
  • 71 просмотр
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Учебный центр IBS
    QPT PostgreSQL 16. Оптимизация запросов
    1 неделя
    Далее
  • Яндекс Практикум
    Фулстек-разработчик
    16 месяцев
    Далее
  • Слёрм
    PostgreSQL База
    4 недели
    Далее
Пригласить эксперта
Ответы на вопрос 2
@Akina
Сетевой и системный админ, SQL-программист.
Напрямую такого нет.

Можно поизвращаться с упаковкой нескольких полей во что-нибудь с последующей распаковкой, но мне это кажется избыточным.

Я бы предложил тупой UNION:
SELECT t2.p_1, ... t2.p_n
FROM t1
LEFT JOIN t2 AS t2 ON t2.t1_id= t1.id
LEFT JOIN t3 AS t2 ON t3.t1_id= t1.id
WHERE <условие>

UNION ALL

SELECT t1.p_1, ... t1.p_n
FROM t1
LEFT JOIN t2 AS t2 ON t2.t1_id= t1.id
LEFT JOIN t3 AS t2 ON t3.t1_id= t1.id
WHERE NOT <условие> OR <условие> IS NULL;

Можно использовать анонимный блок или хранимую процедуру с той же логикой, условием в IF и двумя отдельными запросами.
Ответ написан
Комментировать
@alexalexes
CROSS JOIN LATERAL (
    SELECT t2.p_1, t2.p_2, /* ..., */ t2.p_n
     from /* таблицы */
    WHERE <условие> IS TRUE
    UNION ALL
    SELECT t1._p_1, t1._p_2, /* ..., */ t1._p_n
    from /* таблицы */
    WHERE <условие> IS NOT TRUE
    LIMIT 1
) AS p

Есть такой вариант, но нужно внимательно сравнивать план выполнения запроса с классическим вариантом.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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