Нужно чуть больше информации — вы не приложили исходный запрос и не указали СУБД. Можете вставить ваш запрос и написать, в какой СУБД (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.
Что подходит лучше — зависит от того, нужно ли выбирать полностью разные наборы колонок/таблиц, от производительности и от СУБД. Пришлите исходный запрос и цель (что именно хотите получить), и я предложу точный вариант.