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

Добрый день! Подскажите, существует ли эквивалент следующему запросу:
  • 8 апреля 2026 г. 9:00
Ответы на вопрос 3
Нужно чуть больше информации — вы не приложили исходный запрос и не указали СУБД. Можете вставить ваш запрос и написать, в какой СУБД (SQL Server / PostgreSQL / Oracle / MySQL и т.д.) вы работаете? Тогда дам точный эквивалент.

Ниже — общие подходы, которыми обычно решают «выбрать источник данных по условию»:

1) Динамический SQL (рекомендуем, если нужно целиком поменять таблицу/запрос)
- Построить строку запроса в зависимости от параметра и выполнить её (EXEC / sp_executesql в SQL Server, EXECUTE в PL/pgSQL и т.п.).

Пример (SQL Server):
DECLARE @sql NVARCHAR(MAX);
IF @p = 1
  SET @sql = N'SELECT ... FROM TableA WHERE ...';
ELSE
  SET @sql = N'SELECT ... FROM TableB WHERE ...';
EXEC sp_executesql @sql;

2) UNION ALL с взаимоисключающими WHERE (работает в любой СУБД)
- По сути выполняются оба SELECT, но по логике вернётся только одна ветка:

SELECT columns FROM TableA WHERE @p = 1
UNION ALL
SELECT columns FROM TableB WHERE @p <> 1;

3) Выбор значений через CASE / COALESCE при объединении источников
- Если у вас есть ключи для связывания таблиц, можно сделать JOIN обеих таблиц и выбирать колонки через CASE:

SELECT
  CASE WHEN @p = 1 THEN a.col ELSE b.col END AS col,
  ...
FROM KeyTable k
LEFT JOIN TableA a ON a.key = k.key
LEFT JOIN TableB b ON b.key = k.key

4) Логика в хранимой процедуре / представлении
- Вынести выбор источника в процедуру/функцию/VIEW, чтобы не плодить условные операторы в прикладном SQL.

Что подходит лучше — зависит от того, нужно ли выбирать полностью разные наборы колонок/таблиц, от производительности и от СУБД. Пришлите исходный запрос и цель (что именно хотите получить), и я предложу точный вариант.
Напрямую такого нет. <br/> <br/> Можно поизвращаться с упаковкой нескольких полей во что-нибудь с последующей распаковкой, но мне это кажется избыточным. <br/> <br/> Я бы предложил тупой UNION: <br/> <pre><code class="sql">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 &lt;условие&gt;

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 &lt;условие&gt; OR &lt;условие&gt; IS NULL;</code></pre> <br/> Можно использовать анонимный блок или хранимую процедуру с той же логикой, условием в IF и двумя отдельными запросами.
<pre><code class="sql">CROSS JOIN LATERAL (
    SELECT t2.p_1, t2.p_2, /* ..., */ t2.p_n
     from /* таблицы */
    WHERE &lt;условие&gt; IS TRUE
    UNION ALL
    SELECT t1._p_1, t1._p_2, /* ..., */ t1._p_n
    from /* таблицы */
    WHERE &lt;условие&gt; IS NOT TRUE
    LIMIT 1
) AS p</code></pre> <br/> Есть такой вариант, но нужно внимательно сравнивать план выполнения запроса с классическим вариантом.
Похожие вопросы