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)