Instruction SQL if dans la clause where pour la recherche dans la base de données
Je suis en création d'une procédure stockée à retourner des résultats de recherche, où les paramètres sont facultatifs.
Je veux un "if" dans mon où clause, mais ne peut pas le faire fonctionner. Le où clause de filtre uniquement par les non-null paramètres.
Voici la sp
ALTER PROCEDURE spVillaGet
-- Add the parameters for the stored procedure here
@accomodationFK int = null,
@regionFK int = null,
@arrivalDate datetime,
@numberOfNights int,
@sleeps int = null,
@priceFloor money = null,
@priceCeil money = null
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
select tblVillas.*, tblWeeklyPrices.price from tblVillas
INNER JOIN tblWeeklyPrices on tblVillas.villaId = tblWeeklyPrices.villaFK
where
If @accomodationFK <> null then
accomodationTypeFK = @accomodationFK
@regionFK <> null Then
And regionFK = @regionFK
IF @sleeps <> null Then
And sleeps = @sleeps
IF @priceFloor <> null Then
And price >= @priceFloor And price <= @priceCeil
END
Aucune idées de comment faire cela?
source d'informationauteur mancmanomyst
Vous devez vous connecter pour publier un commentaire.
Nous avons utilisé beaucoup de
COALESCE
ici dans le passé pour "dynamique OÙ l'une des clauses" comme vous êtes en train de parler.Un gros problème se pose si, quand vous voulez en option filtre pour une colonne qui est également nullable... si les données de la colonne est
null
pour une ligne donnée ET que l'utilisateur n'a pas à entrer quoi que ce soit pour une recherche par pour cette colonne (donc l'entrée de l'utilisateur est égalementnull
), alors que la ligne même ne pas apparaître dans les résultats (qui, si les filtres sont en option, est incorrect d'exclusion comportement).Afin de compenser nullable champs, vous finissez par avoir à faire messier à la recherche SQL comme ceci:
Seulement alors, vous comprenez, SI le code de procédure en T-SQl. Il canot être utilisé dans une instruction insert/update/delete/instruction select, il ne peut être utilisée pour déterminer lequel des deux états que vous souhaitez exécuter. Lorsque vous avez besoin de différentes possibilités à l'intérieur d'un énoncé, vous pouvez faire comme ci-dessus ou de l'utilisation d'une instruction case.
Vous pouvez également utiliser la fonction IsNull ou Fusionner en fonction
Cela fait la même chose que Michael suggestion ci-dessus...
IsNull(), et se rejoignent() de travail plus ou moins de la même manière, ils retournent le premier non-argument Null dans la liste, à l'exception de la fonction iSNull permet seulement 2 arguments, et Fusionner pouvez prendre n'importe quel nombre...
http://blogs.msdn.com/sqltips/archive/2008/06/26/differences-between-isnull-and-coalesce.aspx
Essayez de mettre votre instruction if autour de l'ensemble de l'instruction SQL. Que signifie aura une instruction SQL pour chaque condition. Ce qui a fonctionné pour moi.