2

SPを持っています

ALTER PROCEDURE dbo.sp_Compare
    @lst varchar(100),
    @frst varchar(100) = NULL,
    @passportNo varchar(50) = NULL
AS
SELECT * FROM dbo.User
WHERE LastName like '%' + @lst + '%'
    AND (
         FirstName like @frst + ' %'
         OR FirstName like '% ' + @frst + ' %'
         OR FirstName like '% ' + @frst
         OR FirstName = @frst
        )
    OR Passport = @passportNo;

場合によっては@frs、または@passportNoその両方の詳細が利用できない場合があります

したがって、上記のクエリを変更して、オプションのパラメーターが渡されない場合 (つまり、その値が null の場合)、そのパラメーターがその特定の列でのフィルタリングと見なされないようにします。

つまり、@frstNULL の場合、結果は FirstName に基づいてフィルタリングされるべきではなくFirstName like '%' + @frst + '%'、WHERE 句に条件がなかったかのように機能するはずです..

さまざまなケースで同じロジックを繰り返し記述せずにクエリを記述するにはどうすればよいですか?

4

1 に答える 1

10
WHERE (@frst IS NULL OR 
    (
         LastName like '%' + @lst + '%'
         AND (
             FirstName like @frst + ' %'
             OR FirstName like '% ' + @frst + ' %'
             OR FirstName like '% ' + @frst
             OR FirstName = @frst
        )
    )
 )
 AND (@passportNo IS NULL OR
        Passport = @passportNo);

編集:実際には、これはより効率的なはずです:

WHERE ( @frst IS NULL OR FirstName like '%' + @frst + '%' )
AND   ( @lst  IS NULL OR LastName  like '%' + @lst  + '%' )
AND   ( @passportNo IS NULL OR Passport = @passportNo )
于 2012-05-30T11:00:48.910 に答える