Expression de cas SQL à l'aide de parameters nullables

Je passe une list de parameters à ma procédure stockée et certains d'entre eux peuvent être nullable.

Sur la base des valeurs transmises, j'ai besoin de créer une clause where; Ce que j'essaye de faire est si @productType n'est pas nul alors WHERE PmTyId = @productType ELSE ne l'ajoute pas à la clause where.

Comment puis-je y parvenir?

WHERE CASE WHEN @productType IS NOT NULL THEN PmTyId = @productType END 

Normalement, vous n'utilisez pas de case dans une clause where . Vous pouvez résoudre cela avec une logique booleanne simple

 WHERE (@productType IS NULL OR PmTyId = @productType) 

Une option:

 WHERE ISNULL(@productType, PmTyId) = PmTyId 

Je le ferais comme ça. Envelopper entre parenthèses vous permettra d'append plus dans la clause WHERE ;

Ok, testez datatables;

 IF OBJECT_ID('tempdb..#TestData') IS NOT NULL DROP TABLE #TestData GO CREATE TABLE #TestData (IDField int, PmTyId varchar(20)) INSERT INTO #TestData (IDField, PmTyId) VALUES (1,'include') ,(2,'include') ,(3,'dont include') 

Ma requête

 DECLARE @productType varchar(20); SET @productType = 'include' SELECT IDField ,PmTyId FROM #TestData WHERE (@productType IS NULL OR @productType = PmTyId) 

Les sorties;

 IDField PmTyId 1 include 2 include 

Si @productType est défini sur null vous obtenez ces résultats;

 IDField PmTyId 1 include 2 include 3 dont include 

Si vous avez besoin d'append d'autres parameters, faites quelque chose comme ça;

 SELECT IDField ,PmTyId FROM #TestData WHERE (@productType IS NULL OR @productType = PmTyId) OR (@Parameter2 IS NULL OR @Parameter2 = Field2) OR (@Parameter3 IS NULL OR @Parameter3 = Field3)