2017-11-02 19 views
1

従業員のリストをSELECTに設定している一般的なクエリがあります。私のパラメータがsearchType = 'omitの場合、そのテーブルに存在するかどうかをチェックして、その検索に表示されないようにすることはできません。上記の例では データを省略するWHERE句のSQL Case文

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

、私は手順を実行して、私のparamとして omitを渡された場合、それは彼らの userIDが一時テーブルに存在しないすべての従業員を選択します。

これを試してみると、Subquery returned more than 1 valueのエラーが表示されます。

これを設定するにはどうすればよいですか?

+1

クエリ 'SELECT userID FROM @ omit'は1行以上を返しますので、代わりに' NOT EXISTS'を使うといいでしょう – Sami

答えて

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

左外部結合は、結合(従業員)の左側のテーブルからのすべてのレコードを与え、一致するもののみを右側に(省略して)記録します。これは、パラメータが 'omit'のときは、省略表に行を入れることができないことを意味します。

0

あなたは

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

ブックマークにそれを試してみて、Erlandのサイトを読むことができます。あなたは時間があるときにそれのすべて。関連する部分はdynamic search conditionsです。また、投稿する前にインターネットを検索することを検討してください。これは頻繁に話題になるためです。

さらに、「ストアドプロシージャ」にタグを付けましたが、すべてのコードが含まれていませんでした。危険は、誰もあなたのデータ型、あなたの前提、またはプロシージャとのインターフェース方法を見ることができないというコードを省略しています。一般的に、与えられたクエリを作成しようとする「ジェネリック」が多いほど、パフォーマンスが悪くなります。 Erlandは、検索ロジックの多様性に対応するためのさまざまな方法に加えて、これについて説明します。