WHERE子句中的SQL Case语句,用于省略数据

时间:2017-11-02 17:00:17

标签: sql-server stored-procedures sql-server-2012

我设置了一个通用查询,我SELECT列出了一份员工列表。如果我的参数searchType = 'omit,我不想通过检查人员是否存在于临时表中来排除人们出现在该搜索中。

-- Params
@searchType varchar(10)

-- Temp Table
DECLARE @omit AS TABLE (userID INT)
INSERT INTO @omit( userID ) VALUES (123)
INSERT INTO @omit( userID ) VALUES (456)
INSERT INTO @omit( userID ) VALUES (789)

-- Query
SELECT *
FROM Employees
WHERE userID NOT IN( 
    CASE 
        WHEN @searchType = 'omit' 
            THEN (SELECT userID FROM @omit ) 
            ELSE '' 
        END
)

在上面的示例中,如果我运行该过程并将omit作为我的参数传递,它将选择临时表中不存在userID的所有员工。

当我尝试这个时,它会给我一个错误Subquery returned more than 1 value

设置此功能的最佳方法是什么?

4 个答案:

答案 0 :(得分:1)

所以你只想在传递参数时进行过滤?

SELECT e.*
FROM dbo.Employees e
LEFT OUTER JOIN @omit o
    ON e.userID = o.userID
WHERE 
    (@searchType = 'omit' AND o.userID IS NULL)
    OR
    (@searchType != 'omit')

left outer join从连接左侧的表(雇员)中提供所有记录,并且仅记录匹配的右侧(省略)。这意味着当参数被省略时#39;他们不能在省略表中排成一行,否则它并不重要。

答案 1 :(得分:0)

这应该做你想要的:

SELECT e.*
FROM dbo.Employees e
LEFT JOIN @omit o
    ON e.userID = o.userID
WHERE NOT (@searchType = 'omit' AND o.userID IS NOT NULL);

答案 2 :(得分:0)

你可以尝试一下

 SELECT * FROM Employees a WHERE not exists (SELECT 1 FROM @omit b
 where a.userID = B.userID AND @searchType = 'omit')

答案 3 :(得分:0)

收藏并阅读Erland的网站。你有时间的所有这一切。这里的相关部分是dynamic search conditions。也许考虑在发布之前搜索互联网 - 因为这是一个经常出现的主题。

此外,您标记了"存储过程"但没有包括所有代码。遗漏任何代码的危险在于,没有人能够看到您的数据类型,您的假设或您与该过程的接口方式。一般来说,更多"泛型"你试图做一个给定的查询,它执行得越差。除了处理搜索逻辑变化的许多方法之外,Erland还讨论了这一点。