2017-03-16 15 views
2

私はこの種のクエリを持っています。しかし、私はどのように同じ分割機能で冗長な条件を省略することができるようにこのクエリを最適化する必要があります。** IN **クエリで冗長条件を削除する方法Sql

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 
      ) 
+3

ベスト最適化は、複数のデータ値のコンテナのいくつかの種類としてコンマを含む文字列の使用を停止するだろう - テーブルとXML - SQL Serverは、データ型が*複数の値を保持する*設計されています。 –

答えて

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')) 
2

@Damien_The_Unbelieverによると、値の表として分割文字列を使用しないでください。同じ文字列を複数回に分割する必要はありません。代わりに、一時テーブル変数を使用することができます。

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が必要でないと仮定します。

+1

それは彼が言ったことではない... –

+0

@ZoharPeledはい、あなたは正しい。実際には '@Filter'はコードの他にありません。そして、これに基づいて私は特定の従業員が必要です。 EmployeeCode 46,3など – SAL

+0

@SALのように、更新を参照してください、これはあなたに役立つかもしれません。 – Venu

関連する問題