Условный оператор Where в SQL Server

Я создаю SQL-запрос, в котором мне нужно условное выражение where пункт.

Это должно быть что-то вроде этого:

SELECT 
    DateAppr,
    TimeAppr,
    TAT,
    LaserLTR,
    Permit,
    LtrPrinter,
    JobName,
    JobNumber,
    JobDesc,
    ActQty,
    (ActQty-LtrPrinted) AS L,
    (ActQty-QtyInserted) AS M,
    ((ActQty-LtrPrinted)-(ActQty-QtyInserted)) AS N
FROM 
    [test].[dbo].[MM]
WHERE 
    DateDropped = 0
            --This is where i need the conditional clause 
    AND CASE
            WHEN @JobsOnHold = 1 THEN DateAppr >=  0
            ELSE  DateAppr != 0
        END

Вышеупомянутый запрос не работает. Разве это не правильный синтаксис или является там другим способом сделать это, что я не знаю?

Я не хочу использовать динамический SQL, так есть ли любой другой путь, или сделайте я должен использовать обходное решение как использование if else и использование того же запроса с различным where пункты?

59
задан 13 March 2017 в 22:56

1 ответ

Часто при использовании условных операторов Where, Вы заканчиваете upp весьма неэффективным запросом, который примечателен для больших наборов данных, где индексы используются. Отличный способ к оптимизирует запрос для различных значений Вашего параметра , должен сделать другой план выполнения относительно каждого значения параметра. Можно достигнуть этого использования OPTION (RECOMPILE).

В этом примере это, вероятно, не имело бы большого значения, но сказало бы, что условие должно только использоваться в одном из двух случаев, затем Вы могли заметить большое влияние.

В этом примере:

WHERE 
    DateDropped = 0
    AND (
    (ISNULL(@JobsOnHold, 0) = 1 AND DateAppr >= 0) 
    OR 
    (ISNULL(@JobsOnHold, 0) <> 1 AND DateAppr <> 0)
    )
OPTION (RECOMPILE)

Источник Сниффинг Параметра, Встраивание и ПЕРЕКОМПИЛИРОВАТЬ Опции

0
ответ дан 1 November 2019 в 12:07

Другие вопросы по тегам:

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