Frage

Ich bin Erstellen einer gespeicherten Prozedur Suchergebnissen zurückzukehren, wo einige der Parameter optional sind.

Ich will eine „if-Anweisung“ in meiner mit Klausel aber kann sie nicht arbeiten. Die mit Klausel durch Filter sollte nur die Nicht-Null-Parameter.

Hier ist der 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

Alle Ideen, wie dies zu tun?

War es hilfreich?

Lösung

select tblVillas.*, tblWeeklyPrices.price 
from tblVillas
INNER JOIN tblWeeklyPrices on tblVillas.villaId = tblWeeklyPrices.villaFK
where (@accomodationFK IS null OR accomodationTypeFK = @accomodationFK)
  AND (@regionFK IS null or regionFK = @regionFK)
  AND (@sleeps IS null OR sleeps = @sleeps)
  AND (@priceFloor IS null OR (price BETWEEN @priceFloor And @priceCeil))

Andere Tipps

Wir haben eine Menge von COALESCE hier in der Vergangenheit für " dynamische WHERE-Klauseln „wie du redest .

SELECT *
FROM  vehicles
WHERE ([vin]   LIKE COALESCE(@vin, [vin])     + '%' ESCAPE '\')
  AND ([year]  LIKE COALESCE(@year, [year])   + '%' ESCAPE '\')
  AND ([make]  LIKE COALESCE(@make, [make])   + '%' ESCAPE '\')
  AND ([model] LIKE COALESCE(@model, [model]) + '%' ESCAPE '\')

Ein großes Problem stellt sich allerdings, wenn Sie Filter für eine Spalte optional möchten, die auch NULL sein kann ..., wenn die Daten in der Spalte null für eine bestimmte Zeile und der Benutzer ist nicht alles geben für diese Spalte zu suchen, indem (so die Benutzereingabe auch null), dann wird diese Zeile wird nicht einmal in den Ergebnissen zeigen (was, wenn Ihr Filter optional sind, falsche ausschließende Verhalten ist).

Damit NULL festlegbare Felder zu kompensieren, Sie am Ende tun messier aussehendes SQL wie folgt:

SELECT *
FROM  vehicles
WHERE (([vin]   LIKE COALESCE(@vin, [vin])     + '%' ESCAPE '\')
       OR (@vin IS NULL AND [vin] IS NULL))
  AND (([year]  LIKE COALESCE(@year, [year])   + '%' ESCAPE '\')
       OR (@year IS NULL AND [year] IS NULL))
  AND (([make]  LIKE COALESCE(@make, [make])   + '%' ESCAPE '\')
       OR (@make IS NULL AND [make] IS NULL))
  AND (([model] LIKE COALESCE(@model, [model]) + '%' ESCAPE '\')
       OR (@model IS NULL AND [model] IS NULL))

Nur damit Sie verstehen, ist IF prozeduralen Code in T-SQL. Es canot in einem insert / update / delete / select-Anweisung nur zu bestimmen, verwendet werden kann, welche von zwei Anweisungen verwendet werden Sie ausführen möchten. Wenn Sie verschiedene Möglichkeiten innerhalb einer Anweisung benötigen, können Sie wie oben tun oder eine CASE-Anweisung verwenden.

Sie können auch IsNull verwenden oder Funktion Coalesce

Where accomodationTypeFK = IsNull(@accomodationFK, accomodationTypeFK)
    And regionFK = Coalesce(@regionFK,regionFK)
    And sleeps = IsNull(@sleeps,sleeps ) 
    And price Between IsNull(@priceFloor, Price) And IsNull(priceCeil, Price)  

Dies macht das Gleiche wie Michaels Vorschlag oben ...

IsNull () und Coalesce () arbeitet mehr oder weniger die gleiche Art und Weise, sie gibt das erste Nicht-Null-Argument in der Liste, mit der Ausnahme isnull nur 2 Argumente erlaubt, und Coalesce beliebig viele nehmen kann ...

http: / /blogs.msdn.com/sqltips/archive/2008/06/26/differences-between-isnull-and-coalesce.aspx

Versuchen Sie, Ihre IF-Anweisung um die gesamte SQL-Anweisung setzen. Das Mittel wird für jede Bedingung eine SQL-Anweisung hat. Das funktionierte für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top