Условный запрос выбора - PullRequest
3 голосов
/ 08 ноября 2010

У меня большой запрос SQL с несколькими операторами и UNION ALL. Я делаю что-то вроде этого сейчас:

DECLARE @condition BIT;
SET @condition = 0;

SELECT * FROM table1
WHERE @condition = 1;

UNION ALL

SELECT * FROM table2

В этом случае table1 не вернет никаких результатов. Однако этот запрос сложен со многими объединениями (например, FullTextTable). Оценка плана выполнения показывает высокую стоимость, но фактическое количество строк и время выполнения, кажется, показывают иначе. Это самый эффективный способ фильтрации всего запроса или есть лучший способ? Я не хочу, чтобы при первом выборе что-либо запускалось, если это возможно.

Ответы [ 3 ]

2 голосов
/ 08 ноября 2010

Я полагаю, что ваш возможный SQL-запрос со всеми объединениями и условиями, которые зависят от предварительно вычисленных значений, становится довольно сложным. Если вы заинтересованы в уменьшении сложности запроса (не к машине, а в целях обслуживания), я бы переместил отдельные запросы в представления или табличные функции, чтобы переместить эту логику в другое место. Затем вы можете использовать синтаксис if @condition = 1, который был предложен в другом месте.

1 голос
/ 08 ноября 2010

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

ОБЪЯВИТЬ @query VARCHAR (МАКС.);

IF (@condition = 0) SET @query = 'SELECT * FROM table1 UNION ALL '

SET @query = @query + 'SELECT * FROM table2'

sp_executesql @ query

Это просто упрощенный случай, но в реальной реализации вы бы параметризовали динамический запрос, который решит проблему анализа параметров. Вот отличное объяснение этой проблемы Перехват параметров (или спуфинг) в SQL Server

1 голос
/ 08 ноября 2010

Я думаю, что вам лучше с этим:

if (@condition=1)
begin

select * from table1
union all
select * from table2

end
else
begin

select * from table2

end
...