Sql server 如何在**查询Sql中删除**中的冗余条件

Sql server 如何在**查询Sql中删除**中的冗余条件,sql-server,tsql,optimization,query-optimization,Sql Server,Tsql,Optimization,Query Optimization,我有这样的疑问。但我需要优化这个查询,以便如何使用相同的拆分函数省略冗余条件 DECLARE @Filter nvarchar(20) SELECT @Filter ='5,22,3' SELECT * FROM Employee e WHERE e.code IN ( CASE WHEN((SELECT count(*) FROM dbo.FNSPLITSTRING(SUBSTRING(@Filter,1,

我有这样的疑问。但我需要优化这个查询,以便如何使用相同的拆分函数省略冗余条件

DECLARE @Filter nvarchar(20)
SELECT @Filter ='5,22,3'

SELECT * FROM    Employee e
             WHERE e.code IN 
             (
             CASE WHEN((SELECT count(*) FROM dbo.FNSPLITSTRING(SUBSTRING(@Filter,1,LEN(@Filter)-1), ',') d 
                                  WHERE d.splitdata IN (5, 16, 20, 23, 33, 49, 62, 90, 91, 92, 93, 94))>0) THEN 5 ELSE 0 END 
             ,CASE WHEN((SELECT count(*) FROM dbo.FNSPLITSTRING(SUBSTRING(@Filter,1,LEN(@Filter)-1), ',') d 
                                  WHERE d.splitdata IN (22, 18))>0) THEN 46 ELSE 0 END
             ,CASE WHEN((SELECT count(*) FROM dbo.FNSPLITSTRING(SUBSTRING(@Filter,1,LEN(@Filter)-1), ',') d 
                                  WHERE d.splitdata IN (3, 28))>0) THEN 3 ELSE 0 END
             )

正如@Damien_这个不信者所说的,避免将字符串拆分为值表。您不需要多次拆分同一字符串。相反,您可以使用临时表变量

DECLARE @SplitStrings TABLE
(
    splitdata int
)

INSERT @SplitStrings
SELECT splitdata FROM dbo.FNSPLITSTRING(SUBSTRING(@Filter,1,LEN(@Filter)-1), ',') d

DECLARE @EmployeeCodes TABLE
(
    splitdata INT,
    code int
)

INSERT @EmployeeCodes (splitdata, code)
VALUES (5, 5), (16, 5), (20, 5), (23, 5), (33, 5), (49, 5), (62, 5), (90, 5), (91, 5), (92, 5), (93, 5), (94, 5), 
       (22, 46), (18, 46),
       (3, 3), (28, 3)


SELECT e.* 
FROM Employee e
JOIN @EmployeeCodes ec
ON e.code = ec.code
JOIN @SplitStrings ss
ON ec.splitdata = ss.splitdata
我希望这就是你所看到的方向


注意:假设您不需要将
0
作为员工代码。

我采用了新方法。不太复杂,并且省略了冗余代码

DECLARE @Filter nvarchar(20)
SELECT @Filter ='5,22,3'

SELECT Distinct e.EmployeeId FROM Employee e
CROSS JOIN dbo.fnSplitString(@Filter, ',') AS d
WHERE 
(e.code = 5 AND d.splitdata IN ('5', '16', '20', '23', '33', '49', '62', '90', '91', '92', '93', '94'))
OR (e.code = 46 AND d.splitdata IN ('22', '18'))
OR (e.code = 3 AND d.splitdata IN ('3', '28'))

最好的优化方法是停止使用包含逗号的字符串作为多个数据值的某种容器—SQL Server的数据类型设计用于保存多个值—表和xml。@zoharped Yes your right。实际上,
@Filter
是另一种代码。在此基础上,我需要具体的员工。如员工代码46、3等