我有一个从我的用户表返回行的存储过程。用户在前端选择此数据,可以定义他们正在查找的用户类型以及用户。
例如,有3个级别的用户:lvl1Mgr
,lvl2Mgr
,lvl3Mgr
。用户将选择他们想要搜索的级别,然后提供人员列表。
以下是一个例子:
DECLARE @searchType VARCHAR(5) = 'lvl1'
DECLARE @people TABLE (userID INT);
INSERT INTO @people (userID) VALUE (1)
INSERT INTO @people (userID) VALUE (2)
INSERT INTO @people (userID) VALUE (3)
SELECT
u.first,
u.last,
u.email,
u.lvl1Mgr,
u.lvl2Mgr,
u.lvl3Mgr
FROM
USERS as u
WHERE
u.field = 2
AND
(
CASE
WHEN @searchType = 'lvl1' THEN u.lvl1Mgr IN (SELECT userID FROM @people)
WHEN @searchType = 'lvl2' THEN u.lvl2Mgr IN (SELECT userID FROM @people)
WHEN @searchType = 'lvl3' THEN u.lvl3Mgr IN (SELECT userID FROM @people)
END
)
我试图找出如何在AND
语句中执行最终WHERE
子句。根据所选的@searchType
,它将确定我们正在查找哪个列以查看是否存在任何提供的用户。
似乎不喜欢我的IN
部分逻辑。
答案 0 :(得分:2)
我听说它认为这并不像看起来那么糟糕,因为@searchType是常量,SQL查询计划会对变量@SearchType进行谓词推送并知道你想要什么。
SELECT u.fld1
FROM USERS u
WHERE
u.field = 2
AND ( (@searchType = 'lvl1' AND u.lvl1Mgr IN (SELECT userID FROM @people))
OR (@searchType = 'lvl2' AND u.lvl2Mgr IN (SELECT userID FROM @people))
OR (@searchType = 'lvl3' AND u.lvl3Mgr IN (SELECT userID FROM @people))
)
答案 1 :(得分:1)
我认为你最好选择案件中的经理,然后再进行IN。
(
CASE
WHEN @searchType = 'lvl1' THEN u.lvl1Mgr
WHEN @searchType = 'lvl2' THEN u.lvl2Mgr
WHEN @searchType = 'lvl3' THEN u.lvl3Mgr
END IN (SELECT userID FROM @people)
)
答案 2 :(得分:0)
我想这就是你想要的
DECLARE @searchType VARCHAR(5) = 'lvl1'
DECLARE @people TABLE (userID INT);
DECLARE @users TABLE(lvl1 int,lvl2 int,lvl3 int)
INSERT INTO @people select 1
INSERT INTO @people select 2
INSERT INTO @people select 3
INSERT INTO @users
SELECT 0,2,3 UNION
SELECT 4,2,3
SELECT * FROM @users u
WHERE
(CASE
WHEN @searchType = 'lvl1' THEN u.lvl1
WHEN @searchType = 'lvl2' THEN u.lvl2
WHEN @searchType = 'lvl3' THEN u.lvl3
END) in (SELECT UserID FROM @people)