2015-03-20 2 views
0

Я пытаюсь добавить CASE WHEN в следующее рабочего заявление:Использование И в случае, когда

Select ... 
From... 
Where 
    d.name like @filter and d.flags & 0x0F <> 0 

У меня есть ситуации, когда я желаю, чтобы отфильтровать менее, если пользователь устанавливает параметр BIT @showHidden в правда. Это то, что я пробовал:

SELECT...   
FROM... 
WHERE 
d.name like 
    CASE WHEN @showHidden = 'true' THEN 
     @filter 
    ELSE 
     @filter and d.flags & 0x0F <> 0 

Я получаю сообщение об ошибке:

Incorrect syntax near 'and'.

Можно ли иметь AND в пределах CASE WHEN?

+0

Может кто-нибудь объяснить, что не так о том, как я спросил мой вопрос, который вызвал кого-то голосовать его вниз? Я отредактирую свой вопрос, чтобы исправить любые проблемы. –

ответ

5

попробовать:

SELECT...   
FROM... 
WHERE d.name like @filter 
    and (@showHidden = 'true' -- show everything 
     OR 
     d.flags & 0x0F <> 0 -- check if name should be hidden 
    ) 
+0

Я предпочитаю этот ответ, потому что на самом деле не нужно использовать 'CASE', хотя может быть полезно немного больше объяснений. – Tanner

+0

Это работает. Однако я не совсем понимаю это. Почему 'd.flag & 0x0F <> 0)' добавляется только в том случае, когда '@ showHidden' неверен? –

+0

Посмотрите, что я имею в виду ... – Tanner

4

CASE заявление правильно заканчивался END

SELECT...   
FROM... 
WHERE 
d.name like 
    CASE WHEN @showHidden = 'true' THEN 
     @filter 
    ELSE 
     @filter 
    END and d.flags 

Если вы хотели бы добавить критерии в WHEN правильный способ сделать это будет:

SELECT...   
FROM... 
WHERE 
d.name like 
    CASE WHEN @showHidden = 'true' and d.flags THEN 
     @filter 
    ELSE 
     @filter 
    END 

Вы можете иметь много случаев:

SELECT...   
FROM... 
WHERE 
d.name like 
    CASE 
     WHEN Condition1 AND Condition2 THEN 
      @filter1 
     WHEN Condition3 AND Condition4 THEN 
      @filter2 
     WHEN Condition5 THEN 
      @filter3 
     ELSE 
      @filter4 
    END 

ELSE, чтобы убедиться, что вы получите значение, если условие не выполнено.

UPDATE

В моем ответе я пытался дать некоторую информацию о том, как СЛУЧАЙ работает, хотя на самом деле не отвечая на весь вопрос.

Если вы хотите пример того, как использовать CASE в этом, и вы хотите, чтобы @Filter работать только тогда, когда @showHidden верно, то:

d.name like 
    CASE 
     WHEN @showHidden = 'true' THEN @filter 
     ELSE d.name 
    END 

Так что, если @showHidden то d.name должен быть как @filter еще это должно быть как d.name (всегда верно).

+0

Спасибо. Я не понимал, что мне не хватает «КОНЕЦ». В первом блоке кода добавляется часть 'd.flags' независимо от того, что. Я хочу, чтобы эта часть была добавлена, только если '@ showValue' неверно. Опять же, ваш ответ был полезен, спасибо! –

Смежные вопросы