使用多个字段的

时间:2018-03-08 18:05:06

标签: sql sql-server stored-procedures

我有一个从我的用户表返回行的存储过程。用户在前端选择此数据,可以定义他们正在查找的用户类型以及用户。

例如,有3个级别的用户:lvl1Mgrlvl2Mgrlvl3Mgr。用户将选择他们想要搜索的级别,然后提供人员列表。

以下是一个例子:

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部分逻辑。

3 个答案:

答案 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)