2016-04-08 4 views
0

Я попытался использовать оператор CASE в предложении WHERE, но это не сработало. Любая помощь действительно оценена, спасибо!Оператор CASE в предложении WHERE в SQL (SQL Server)

SELECT 
... 
FROM ... 
WHERE 
    CASE 
    WHEN @LastName <> '' AND @CardNo <> '' AND @StoreNo <> '' THEN 
     ((m.ApplicantLastName LIKE @LastName AND m.StoreNo = @StoreNo) OR 
     (m.CardNo LIKE @CardNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '')) 
    WHEN @LastName <> '' AND @CardNo <> '' THEN 
     (m.ApplicantLastName LIKE @LastName OR (m.CardNo LIKE @CardNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '')) 
    WHEN @LastName <> '' AND @StoreNo <> '' THEN 
     (m.ApplicantLastName LIKE @LastName AND m.StoreNo = @StoreNo) 
    WHEN @LastName <> '' THEN 
     m.ApplicantLastName LIKE @LastName 
    WHEN @CardNo <> '' THEN 
     (m.CardNo LIKE @CardNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '') 
    END 

ответ

4

Это неправильное использование СЛУЧАЯ:

(m.CardNo LIKE @CardNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '') 

Вы не можете использовать его для создания предикатов на рейс. Вы можете использовать CASE только для генерации значения, которое вы можете сравнить с чем-то в предложении WHERE.

0

Вы можете переписать вам логику без case делать что-то вроде этого:

WHERE ((@LastName = '' AND LTRIM(RTRIM(m.ApplicantLastName)) <> '') OR 
     (m.ApplicantLastName LIKE @LastName) 
    ) AND 
     (@CardNo = '' OR m.CardNo LIKE @CardNo) AND 
     (@StoreNo = '' OR m.StoreNo = @StoreNo) 

Обратите внимание, что эта логика часто пишется в предположении NULL вместо пустой строки:

WHERE (@LastName IS NULL OR m.ApplicantLastName LIKE @LastName) AND 
     (@CardNo IS NULL OR m.CardNo LIKE @CardNo) AND 
     (@StoreNo IS NULL OR m.StoreNo = @StoreNo) 

И, если вы имеют индексы в этих столбцах, тогда вы можете захотеть рассмотреть динамический SQL, чтобы конечный запрос мог использовать индексы.

1

Параметры могут использоваться в предложении where, так как там были поля для объединения в фильтр.

WHERE 
    (@CardNo='' OR m.CardNo LIKE @CardNo)  
    AND 
    (@LastName='' OR m.ApplicantLastName LIKE @LastName) 
    AND 
    (@StoreNo='' OR m.StoreNo = @StoreNo) 
    AND 
    (@CardNo='' OR LTRIM(RTRIM(m.ApplicantLastName)) <> '') 
0

я, наконец, получил это работает со следующим:

SELECT 
... 
FROM ... 
WHERE 
    CASE 
    WHEN @LastName <> '' AND @BimartNo <> '' AND @StoreNo <> '' AND 
     ((m.ApplicantLastName LIKE @LastName AND m.StoreNo = @StoreNo) OR 
     (m.BimartNo LIKE @BimartNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '')) THEN 1 
    WHEN @LastName <> '' AND @BimartNo <> '' AND @StoreNo IS NULL AND 
     (m.ApplicantLastName LIKE @LastName OR (m.BimartNo LIKE @BimartNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '')) THEN 1 
    WHEN @LastName <> '' AND @StoreNo <> '' AND @BimartNo IS NULL AND 
     (m.ApplicantLastName LIKE @LastName AND m.StoreNo = @StoreNo) THEN 1 
    WHEN @LastName <> '' AND @BimartNo IS NULL AND @StoreNo IS NULL AND 
     m.ApplicantLastName LIKE @LastName THEN 1 
    WHEN @BimartNo <> '' AND @LastName IS NULL AND @StoreNo IS NULL AND 
     (m.BimartNo LIKE @BimartNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '') THEN 1 
    ELSE 0 
    END = 1 

То, что я узнал, если мы хотим сделать:

WHERE 
    IF A THEN X 
    ELSE IF B THEN Y 

В SQL, это было бы:

WHERE 
    CASE 
    WHEN A AND X THEN 1 
    WHEN B AND Y THEN 1 
    ELSE 0 
    END = 1 

Denis/lrb/Gordon: Спасибо за все y ou вход!

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