2013-04-02 5 views
0

У меня есть sproc, который выглядит как:Оператор IF В ИНЕКЕ

-- @intUserType int (Passed in from sproc) 

IF @intUserType = 1 
BEGIN 
    SELECT * FROM Users 
    WHERE Users.isDeleted = 0 
END 

IF @intUserType = 4 
BEGIN 
    SELECT * FROM Users 
    WHERE Users.isDeleted = 0 
    AND Users.UserType <> 1 
END 

IF @intUserType = 3 
BEGIN 
    SELECT * FROM Users 
    WHERE Users.isDeleted = 0 
    AND Users.UserType IN (1,3,4) 
END 

Я хотел бы сократить его и не использовать так много операторов выбора, вроде как:

SELECT * FROM Users 
WHERE Users.isDeleted = 1 
AND 
    IF @intUserType = 1 
     THEN Users.UserType > 0 
    ELSE IF @intUserType = 4 
     THEN Users.UserType <> 1 
    ELSE IF @intUserType = 3 
     THEN Users.UserType NOT IN(1,3,4) 
    END 
END 

Спасибо за любого Помогите.

Роб

ответ

6
SELECT * FROM Users 
WHERE Users.isDeleted = 0 AND 
( 
    (@intUserType = 1) OR 
    (@intUserType = 4 AND Users.UserType <> 1) OR 
    (@intUserType = 3 AND Users.UserType IN (1,3,4)) 
) 
+0

Спасибо, это сработало отлично! – Robert

5
SELECT * FROM Users 
WHERE @intUserType = 1 AND Users.isDeleted = 0 
    OR (@intUserType = 4 AND Users.isDeleted = 0 AND Users.UserType <> 1) 
    OR (@intUserType = 3 AND Users.isDeleted = 0 AND Users.UserType IN (1,3,4)) 
0

Вот еще один способ сделать это, просто для полноты картины. Вы можете построить функцию CASE для оценки нескольких выражений в предложении WHERE:

SELECT * 
FROM Users 
WHERE 
    CASE 
     WHEN @intUserType = 1 AND Users.isDeleted = 0 THEN 1 
     WHEN @intUserType = 4 AND Users.isDeleted = 0 AND Users.UserType <> 1 THEN 1 
     WHEN @intUserType = 3 AND Users.isDeleted = 0 AND Users.UserType IN (1,3,4) THEN 1 
     ELSE 0 
    END = 1; 
Смежные вопросы