2017-04-20 8 views
4

は、ストアドプロシージャのステートメントを作成しますSQLクエリにIF-THEN-ELSEロジックを使用してオプションのパラメータを含めるにはどうすればよいですか?ここ

Create Procedure SearchCreatedAssignments 
(@LessonName Varchar(50), @DateFrom date, @DateTo Date, @LocationCode Varchar(10)) 
As 
BEGIN 

基本的に、私は、パラメータの値に基づいてデータベースを検索し、クエリを書きたいです。たとえば、

Select * 
from dbo.test 

where (LessonName = @LessonName) 
AND (StartDate = @DateFrom) 
AND (EndDate = @DateTo) 
AND (LocationCode = @LocationCode) 

かなり簡単ですか?ただし、これらのパラメータのいずれかがNULL(空の文字列を含む)の場合、検索から除外し、nullでないパラメータのみで検索したいと思います。私はこのようなことを考えていた:

--if @LocationCode is null OR @LocationCode = '' -> omit @LocationCode from the search 

これは明らかに擬似コードです。これどうやってするの?これが単純な仕事であれば私を許してください。私はSQLに新しいです。

答えて

4

は、次のことを考えてみましょう。

where LessonName = coalesce(@LessonName, LessonName) 
    AND StartDate = coalesce(@DateFrom, StartDate) 
    AND EndDate = coalesce(@DateTo, EndDate) 
    AND LocationCode = coaleasce(@LocationCode, LocationCode) 

私はよく分からないが:パラメータがNULLまたは空の場合、デフォルト値は

Select * 
from dbo.test 
where LessonName = IsNull(NullIf(@LessonName,''),LessonName) 
AND StartDate = IsNull(NullIf(@DateFrom,''),StartDate) 
AND EndDate  = IsNull(NullIf(@DateTo,''),EndDate) 
AND LocationCode = IsNull(NullIf(@LocationCode,''),LocationCode) 
+0

したがって、パラメータがnull(または空の文字列を含む)の場合、基本的に検索から除外されますか? – ic3man7019

+0

@ ic3man7019いいえ、フィールドを自分と比較して評価します。ほとんどの答えは同じです。 –

+2

@ ic3man7019私はジャンプして、それが省略されたのと同じ結果を与えることを指摘したいと思います。私はこの練習をたくさん使っていますが、このような種類のクエリの方が良いとは思っていません。また、他の多くの答えは、動的SQLを提案している、私は可能な限り避けるだろう。動的SQLを使用する場合、[パフォーマンスとセキュリティ](http://www.sommarskog.se/dynamic_sql.html)への影響を考慮してください。 – ahoxha

0

あなたは、動的SQL文を書いて、あなたの手順でsp_ExecuteSQLを使用して、それを実行するか、のようなSQLでトリッキー得ることができ、次のいずれか

Select * 
from dbo.test  
where (LessonName = @LessonName) 
AND (StartDate = @DateFrom) 
AND (EndDate = @DateTo) 
AND (LocationCode = @LocationCode or @LocationCode IS NULL or @LocationCode = '') 
0

あなたはこの方法でそうするCOALESCE機能を使用することができ、問題のフィールドになります空の文字列についてそれはヌル値で動作し、他のデータベースでは空の文字列を処理します。それが動作しない場合は、同じようにcaseを使用することができます。

LessonName = case when @LessonName is not null and @LessonName != '' 
        then @LessonName else LessonName end 

そして、ちょうど他のパラメータに同じロジックを使用しています。

0

INHOこのケースでは、動的なクエリを使用することをお勧めします。

DECLARE @cmd VARCHAR(MAX); 

SET @CMD = 'SELECT * FROM dbo.Text WHERE @Param1 = 'x''; --at least on parameter 
IF @PARAM2 IS NOT NULL 
BEGIN 
    SET @CMD = @CMD + ' AND Param2 = @Param2' 
END 
IF @PARAM3 IS NOT NULL 
BEGIN 
    SET @CMD = @CMD + ' AND Param3 = @Param3' 
END 

EXECUTE (@CMD); 
+1

確かに最善の方法ではありません。 –

+0

@JorgeCamposはもっと良い方法かもしれない – McNets

+0

はい、それは間違いなく.... –

関連する問題