2016-04-14 7 views
0

私はツールを使用してSQLクエリを生成しており、複数のパラメータでクエリの1つをフィルタリングする必要があります。T-SQLパラメータのリストから別の値を取得

クエリは次のようになります。

Select * 
From Products 
Where (@ProductTypeIds is null or Product.ProductTypeId in (@ProductTypeIds)) 

私は基本的に..

を読み、上記のクエリは、伝統的なSQLに正しくないですけど、私は適用しようとしていますフィルター。@ProductTypeIdsパラメーターに何も渡されない場合、where条件は適用されません。複数のパラメータが渡されているとき

、しかし、@ProductTypeIdsは、次のクエリにツールによって翻訳されている:

Select * 
From Products 
Where (@ProductTypeIds1, @ProductTypeIds2 is null or Product.ProductTypeId in (@ProductTypeIds1, @ProductTypeIds2)) 

明らかに無効なクエリはどれ。

Select * 
From Products 
Where (COALESCE(@ProductTypeIds, null) is null or Product.ProductTypeId in (@ProductTypeIds)) 

このクエリは正しく変換されている、しかし、今COALESCEの私の使用は、エラーがスローされます:

どう

At least one of the arguments to COALESCE must be an expression that is not the NULL constant.

だから、私は賢いことと、彼らがnullかどうかを確認するためにCOALESCEを使用して考えていました私は効率的にその@ProductTypeIdsをチェックすることができますか(@ProductTypeIds1, @ProductTypeIds2に翻訳されているので、フィルタを適用するか無視しますか?

つまり、パラメータのリストはDistinctですか?最終結果がnullかどうかを確認します。

おかげ

+0

?この変数のタイプは何ですか? – Shnugo

+0

@Shnugo C#の 'List 'であり、Telerik Reportsに渡され、[多値nullableパラメータ](http://docs.telerik.com/reporting/designing-reports-parameters) – LocustHorde

+0

私は経験がありませんTelerikのレポート(btw:これはあなたの質問で与えるべき情報です)ですが、これは宣言されたテーブル変数またはSQL Serverの型だと思いますか?そうでなければ、ドキュメンテーションの指示どおりに "論理IN"で使用することはできませんでした。後で '@ ProductTypeIds1'(と... 2、... 3)について書くのですか?まあ。あなたは既に1つの答えを受け入れています。しかし... – Shnugo

答えて

2

は、私はあなたのツールがどのように動作するかわかりませんが、以下を試してみてください。

代わりのようなあなたのparamsに来ることはありません値のnullチェックのチェック:どのようにあなたが `ProductTypeIds` @に渡している

WHERE COALESCE(@ProductTypeIds1, @ProductTypeIds2, -666) == -666 OR ... 
+1

優秀!それはもちろん動作します、私はそれを見ているので、今は明らかです!どうもありがとうございます。 – LocustHorde

関連する問題