2014-12-09 4 views
1
SELECT  
* 
FROM tbl_Something 
WHERE 
RoleID = 1 AND 
GroupID = 
    CASE 
     WHEN @GroupID = 1 THEN @GroupID OR GroupID IS NULL -- issue here 
     WHEN @GroupID = 2 THEN @GroupID 

То, что я хочу сделать, это когда @GroupID = 2, то GroupID = @GroupID смысл получить все строки с GroupID = 2 когда @GroupID == 1, то GroupID = @GroupID или GroupID IS NULL значения получает все строки с GroupID = 1 или GroupID IS NULLSQL, где положение случай

Где я буду неправильно

+0

Не был бы вы хотите проверить, попадает ли @GroupID в допустимый диапазон значений, прежде чем вы даже запустите запрос? – Crono

ответ

2

Вы должны разделить состояние, потому что OR GroupID IS NULL не может быть частью выражения, которое выбирает GroupID для сравнения. Поскольку у вас есть только две возможности для @GroupID, было бы чище переписать запрос без CASE вообще:

SELECT  
* 
FROM tbl_Something 
WHERE 
RoleID = 1 AND (
    (@GroupID = 1 AND GroupID = 1) 
    OR 
    (@GroupID = 2 AND (GroupID = 2 OR GroupID IS NULL)) 
) 
+0

@paqogomez Это потому, что вопрос редактировался несколько раз. Это было 1, затем 2, и теперь это снова 1. Я не изменил его на 1, потому что я думаю, что OP получит идею в любом случае. – dasblinkenlight

+0

есть. была дискуссия с командой. 1 и 2 продолжали меняться. Извините, я не должен был обновляться. концепция остается неизменной. Спасибо за ответ. – DotNetBeginner

1

Вы можете использовать ISNULL для этого. Он будет проверять, если GroupId равно @GroupId, если GroupId является недействительным он будет проверять, если 1 равно @GroupID

ISNULL(GroupID,2) = @GroupID 
+1

Проверьте правильность. Это не работает – DotNetBeginner

+1

Отредактировано. Но если вы все время меняете вопрос, как он будет работать ...? – Hatsjoem

+0

Извините. «Просто незаполненная моя свинца изменилась» – DotNetBeginner

1

Использование Coalesece или IsNull:

WHEN Coalesce(@GroupID, 1) = 1 THEN 1 

Дополнительно, обратите внимание, что при проверяются на 1, его легче читать, если вы только что вернетесь.

1

Зачем использовать CASE WHEN вообще, когда вы можете сделать это:

SELECT  
    * 
FROM 
    tbl_Something 
WHERE 
    RoleID = 1 AND 
    ISNULL(GroupID, 1) = @GroupID 

... если вам не нужно, чтобы убедиться, что запрос не должен ничего возвращать, если @GroupID что-нибудь другое, чем 1 или 2, в этом случае следующий будет намного лучше:

IF @GroupId IN (1, 2) 
BEGIN 
    SELECT  
     * 
    FROM 
     tbl_Something 
    WHERE 
     RoleID = 1 AND 
     ISNULL(GroupID, 1) = @GroupID 
END 
Смежные вопросы