Sélectionnez tous si le paramètre est null dans une procédure stockée
Je veux créer une procédure SQL Server qui permettra de sélectionner et de joindre deux tables. Les paramètres @entreprise, @de et @sont toujours ensemble, mais @serie_type peut être NULL. Si @serie_type n'est pas NULLE, je veux juste inclure les types spécifiés, simple AND S.Type = @serie_type
, mais si @serie_type est NUL je veux inclure tous les types, simple, il suffit de ne pas inclure l'instruction ET. Mon problème est que je ne sais pas si @serie_type sera mis donc je voudrais s avoir quelque chose comme ceci:
/* pseudocode */
??? = AND (IF @serie_type IS NOT NULL S.Type = @serie_type)
Ici est un simpifyed version de procédure:
CREATE PROCEDURE Report_CompanySerie
@company INT,
@serie_type INT,
@from DATE,
@to DATE
AS
BEGIN
SELECT
*
FROM Company C
JOIN Series S ON S.Company_FK = C.Id
WHERE C.Id = @company
AND S.Created >= @from
AND S.Created <= @to
/* HERE IS MY PROBLEM */
AND ???
END
GO
Ne veux pas dupliquer le sélectionner becaust le réel sélectionnez est plus grand alors ce.
OriginalL'auteur Andreas | 2011-09-22
Vous devez vous connecter pour publier un commentaire.
Il est pas besoin de faire
AND (@serie_type IS NULL OR S.Type = @serie_type)
que SQL Server a une fonction intégrée pour faire de cette logique pour vous.Essayez ceci:
Cela renvoie
vrai si @serie_type est null ou le résultat de @serie_type = S. Type si @serie_type n'est pas null.
De la MSDN:
on dirait que vous sont mauvais,
ISNULL ( check_expression , replacement_value )
- "Retourne le même type que check_expression."J'ai modifier cette réponse. Vous avez tort. J'ai été en utilisant ce depuis des années sur SQL Server.
Vous avez absolument raison, a appris quelque chose de nouveau aujourd'hui. Vraiment désolé
Sangha : ce que tu veux dire en disant "pas besoin de le faire ..."? Ce n'est pas un hack mais ANSI SQL construction, contrairement à
ISNULL
est T-SQL spécifique. Je suis cqan comprends pas pourquoi "pas besoin de faire" sentense, est-il des effets secondaires-vous dire ou quoi? De plus au cours, de mon point de vue de la condition avecOR
est beaucoup plus propre alorsISNULL
OriginalL'auteur Preet Sangha
De l'approche commune est:
OriginalL'auteur sll
Vous pouvez également utiliser l'instruction de cas dans la clause where
où e.ZoneId = cas lorsque @zoneid=0, alors e.zoneid d'autre @zoneid fin
OriginalL'auteur Shreyas Maratha
Très propre approche sera à définir votre
@serie_type
être0
. Jetez un oeil ci-dessous:OriginalL'auteur Isaac Lem