Как использовать случай, когда в где состояние TSQL? - PullRequest
0 голосов
/ 10 февраля 2011

Ниже приведена часть хранимой процедуры: -

@ID int
@Col1 int
@Col2 int

Select * 
from Table_01 t1
JOIN table_02 t2 on t1.col = t2.col
where 
  1 = case when @Col1 = 0 then 1 else (case when t2.Col1 = @Col1 then 1 else 0 end) end
  AND 1 = case when @Col2 = 0 then 1 else (case when t2.Col2 = @Col2 then 1 else 0 end) end
  AND 1 = case when @ID = 0 then 1 else (case when t2.ID = @ID then 1 else 0 end) end

В настоящее время

  • , если @ID = 0, тогда игнорируется условие
  • , если @IDимеет значение, то возвращает результаты, основанные на удовлетворении критериев

Мне нужно добавить еще одно условие: -

if @ID = -1, тогда не должно возвращаться ни одного результата (потому что совпадений нет) но он должен действовать как @ID = 0 (игнорировать, чтобы добавить выражение)

Я ясно?(

Ответы [ 3 ]

0 голосов
/ 10 февраля 2011

Я бы попытался написать это так, чтобы она была понятнее:

WHERE @ID IN (0, t2.ID) AND @ID <> -1

или

WHERE (@ID = 0 OR t2.ID = @ID) AND @ID <> -1

Если t2.ID не может быть -1, то эта часть вам не нужна.

0 голосов
/ 10 февраля 2011

Если я вас правильно понимаю, вы просто хотите, чтобы @ID = -1 имел тот же эффект, что и @ID = 0. В этом случае ваш запрос может выглядеть следующим образом:

Select * 
FROM Table_01 t1
  JOIN table_02 t2 on t1.col = t2.col
WHERE @Col1 IN (0, t2.Col1)
  AND @Col2 IN (0, t2.Col2)
  AND @ID IN (-1, 0, t2.ID)
0 голосов
/ 10 февраля 2011
Select ...
From Table_01 As t1
    Join table_02 As t2 
        On t1.col = t2.col
Where Case 
        When @ID = 0 Then 1 
        When t2.ID = @ID Then 1 
        When @ID = -1 Then 0
        Else 0 
        End = 1

Если это последнее условие должно превзойти другие два, вам нужно изменить порядок:

Select ...
From Table_01 As t1
    Join table_02 As t2 
        On t1.col = t2.col
Where Case 
        When @ID = -1 Then 0
        When @ID = 0 Then 1 
        When @ID = t2.ID Then 1 
        Else 0 
        End = 1

Конечно, другой способ, который может работать лучше (при условии @ID = -1 козыри):

Select ...
From Table_01 As t1
    Join table_02 As t2 
        On t1.col = t2.col
Where @ID != -1 
    And ( @ID = 0 Or @ID = t2.ID )

Обновление на основе редактирования OP

Похоже, вы пытаетесь сделать что-то вроде следующего:

Select ...
From Table_01 As t1
    Join table_02 As t2 
        On t1.col = t2.col
Where @ID != -1
    And ( @Col1 = 0 Or @Col1 = t2.Col1 )
    And ( @Col2 = 0 Or @Col2 = t2.Col2 )
    And ( @ID = 0 Or @ID = t2.ID )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...