2015-12-08 4 views
1

Я хочу выбрать все строки из таблицы temp, когда я не предоставляю никаких параметров в предложении where.Выбор всех строк, если условие равно null в SQL Server

Ниже приведена моя хранимая процедура; #ContactAddressDetails - моя временная таблица, где доступны окончательные данные. @ZipCodeOrigin, @ZipCodeDestination являются параметры

  • если @ZipCodeOrigin = null и @ZipCodeDestination = null, то я хочу, чтобы получить все записи, в противном случае только те сопоставления пункт where

Код:

CREATE PROCEDURE [CR2].[spGetEmailAddressByZipsTypeahead]  
    @LoggedInUserId BIGINT 
    ,@ZipCodeOrigin VARCHAR(10) = NULL  
    ,@ZipCodeDestination VARCHAR(10) = NULL  
    ,@searchText varchar(15)  
AS  
BEGIN  
    DECLARE @OfficeId INT, @AccountId INT  

    CREATE TABLE #ContactGroupList (ContactGroupId INT)  

    SELECT  
     @OfficeId = OfficeId,  
     @AccountId = AccountID  
    FROM CR2.vwAcgUserCustomer WITH (NOLOCK)  
    WHERE UserID = @LoggedInUserId  

    -- Find the all Contact Group associated to the User, his/her Office and Account  
    INSERT INTO #ContactGroupList  
     SELECT ContactGroupId  
     FROM CR2.ContactGroup WITH (NOLOCK)  
     WHERE ((OwnerType = 1 AND OwnerId = @AccountId)  
       OR (OwnerType = 2 AND OwnerId = @OfficeId)  
       OR (OwnerType = 3 AND OwnerId = @LoggedInUserId))  

    --Display all the addresses of the above contact groups.  
    SELECT  
     CA.ContactAddressId,   
     CA.Email AS [Email],  
     CA.AddressType,  
     CA.AddressCode 
    INTO 
     #ContactAddressDetails  
    FROM 
     CR2.ContactAddress AS CA WITH (NOLOCK)  
    INNER JOIN 
     #ContactGroupList list ON list.ContactGroupId = CA.ContactGroupId  
    LEFT JOIN 
     CR2.ContactAddressDefaultSettings AS CADS WITH (NOLOCK) ON CADS.ContactAddressId = CA.ContactAddressId  
    LEFT JOIN 
     CR2.ContactAddressDefault CAD WITH (NOLOCK) ON CAD.ContactAddressId = CA.ContactAddressId  
                AND CAD.UserId = @LoggedInUserId   
    WHERE 
     CA.ZipCode In (@ZipCodeOrigin, @ZipCodeDestination)  
     AND CA.Email LIKE @searchText + '%'  
     AND CA.IsDeleted = 0  
     AND CA.AddressType = 3  

    SELECT *  
    FROM #ContactAddressDetails  

    DROP TABLE #ContactAddressDetails  
    DROP TABLE #ContactGroupList  
END 
+0

[Динамические условия поиска в T-SQL] (http://www.sommarskog.se/dyn-search-2008.html) –

ответ

2

Заменить

WHERE CA.ZipCode IN (@ZipCodeOrigin, @ZipCodeDestination) 

с

WHERE (CA.ZipCode In (@ZipCodeOrigin, @ZipCodeDestination)) 
    OR (@ZipCodeOrigin IS NULL AND @ZipCodeDestination IS NULL) 

Это условие будет истинным, когда оба @ZipCodeOrigin и @ZipCodeDestination равны нулю, или когда CA.ZipCode соответствует один или оба из них.

+0

Спасибо. Он отлично работает –

2

вы можете использовать этот предикат не фильтрует данные, если оба zipcode имеют значение null:

((@ZipCodeOrigin is null and @ZipCodeDestination is null) OR CA.ZipCode In (@ZipCodeOrigin, @ZipCodeDestination) )

Смежные вопросы