2014-11-02 2 views
0

Возможно ли опустить WHERE, если переменная является определенным значением? Следующие не работают, и я изо всех сил пытаюсь найти ответ;Если Var определенно Значение опускает WHERE

DECLARE @rMonth int, @rYear int, @sID int 
SET @rMonth = 0; 
SET @rYear = 0; 
SET @sID= 0; 

SELECT 
    TCS.bStatus AS jStatus, TCS.ID, TCS.sID, TCS.insDate, TCS.statusLabel, TCS.cID 
FROM 
    TCS 
    CASE WHEN @rMonth > 0 THEN 
     WHERE month(insDate) = @rMonth AND year(insDate) = @rYear 
END 
+1

Если у вас большой стол и забота о производительности, вы должны задать другой вопрос. Структура ваших аргументов 'where' (и' where' в ответах) предотвращает использование индексов. –

ответ

2

Это общий сценарий включить положение условно

проверить это:

WHERE 
    (@rMonth = 0 OR MONTH(insDate) = @rMonth) 
AND (@rYear = 0 OR YEAR(insDate) = @rYear) 
AND (@sID = 0 OR sID = @sID) 

В приведенном выше запросе и для каждого пункта, правая сторона «ИЛИ» является применяется только в том случае, если левая сторона ложна. В противном случае целое предложение считается истинным и не фильтрует ни одну строку.
Надеюсь, используя вышеприведенный трюк, любое сложное предложение может быть написано в правой части «ИЛИ», а не простое сравнение равенства.

+0

Интересно. Обычно я вижу, что это делается с помощью NULL, например 'WHERE (@rMonth IS NULL ИЛИ MONTH (insDate) = @rMonth)' –

+0

@JohnSaunders. Вы правы, передавая эти параметры, поскольку NULL звучит более стандартно. Но он старается считать 0 ничем, так что это его выбор :) –

3
WHERE 
    (@rMonth <= 0) 
    OR 
    (month(insDate) = @rMonth AND year(insDate) = @rYear) 
+0

Спасибо @GSerg. прочитайте мой комментарий в приведенном выше ответе. Мне нужно получить все записи. Когда rMonth = 0. – DannyBoy

+0

Это будет извлекать все записи, когда rMonth = 0. – GSerg

0

Еще два варианта для достижения того же результата:

один - используя CASE заявление, как вы хотели изначально:

WHERE MONTH(insDate) = CASE WHEN @rMonth > 0 THEN @rMonth ELSE MONTH(insDate) END 
AND YEAR(insDate) = CASE WHEN @rYear > 0 THEN @rYear ELSE YEAR(insDate) END 
AND sID = CASE WHEN @sID > 0 THEN @sID ELSE sID END 

, а другой - с помощью ISNULL и NULLIF функции:

WHERE MONTH(insDate) = ISNULL(NULLIF(@rMonth, 0), MONTH(insDate)) 
AND YEAR(insDate) = ISNULL(NULLIF(@rYear, 0), YEAR(insDate)) 
AND sID = ISNULL(NULLIF(@sID, 0), sID) 
Смежные вопросы