Frage

Ich habe eine gespeicherte Prozedur in SQL Server 2000, die eine Suche auf Basis von Parameterwerten führen. Für einen des Parameter übergeben, ich brauche eine andere WHERE Klausel abhängig von seinem Wert - das Problem ist, dass die drei Werte wären, wo MyColumn

  1. IS NULL
  2. IS NOT NULL
  3. ANY VALUE (NULL AND NOT NULL) (im Wesentlichen keine WHERE Klausel)

Ich habe einige mentale Blockade in der korrekten Syntax kommen. Ist dies möglich, in einer select-Anweisung zu tun, ohne etwas IF @parameter BEGIN ... END Durchführung Verzweigung?

War es hilfreich?

Lösung

Hier ist, wie Sie dies mit einer einzigen WHERE Klausel lösen können:

WHERE (@myParm = value1 AND MyColumn IS NULL)
OR  (@myParm = value2 AND MyColumn IS NOT NULL)
OR  (@myParm = value3)

Eine naive Verwendung der CASE-Anweisung funktioniert nicht , damit meine ich die folgende:

SELECT Field1, Field2 FROM MyTable
WHERE CASE @myParam
    WHEN value1 THEN MyColumn IS NULL
    WHEN value2 THEN MyColumn IS NOT NULL
    WHEN value3 THEN TRUE
END

Es ist möglich, dies mit einer Case-Anweisung zu lösen, siehe onedaywhen beantworten

Andere Tipps

Sie könnten nur etwas tun, wie folgt aus:

SELECT *
FROM foo
WHERE (@param = 0 AND MyColumn IS NULL)
OR (@param = 1 AND MyColumn IS NOT NULL)
OR (@param = 2)

So ähnlich.

Dies ist, wie kann es mit CASE getan werden:

DECLARE @myParam INT;
SET @myParam = 1;

SELECT * 
  FROM MyTable
 WHERE 'T' = CASE @myParam
             WHEN 1 THEN 
                CASE WHEN MyColumn IS NULL THEN 'T' END
             WHEN 2 THEN
                CASE WHEN MyColumn IS NOT NULL THEN 'T' END
             WHEN 3 THEN 'T' END;
WHERE MyColumn = COALESCE(@value,MyColumn) 
  • Wenn @value NULL ist, wird es MyColumn sich vergleichen zu können, ignoriert @value = no where Klausel.

  • IF @value hat einen Wert (NOT NULL) wird es vergleichen MyColumn zu @value.

Referenz: COALESCE (Transact-SQL) .

Eine andere Art und Weise von CASE:

SELECT *  
FROM MyTable
WHERE 1 = CASE WHEN @myParm = value1 AND MyColumn IS NULL     THEN 1 
               WHEN @myParm = value2 AND MyColumn IS NOT NULL THEN 1 
               WHEN @myParm = value3                          THEN 1 
          END

Ich habe Erfolg mit dieser Lösung hat. Es ist fast wie Patrick, mit einem kleinen Twist. Sie können diese Ausdrücke einzeln oder nacheinander verwendet werden. Wenn der Parameter leer ist, so wird er ignoriert und alle Werte für die Spalte, die Ihre Suche angezeigt werden, einschließlich NULLS.

SELECT * FROM MyTable
WHERE 
    --check to see if @param1 exists, if @param1 is blank, return all
    --records excluding filters below
(Col1 LIKE '%' + @param1 + '%' OR @param1 = '')
AND
    --where you want to search multiple columns using the same parameter
    --enclose the first 'OR' expression in braces and enclose the entire 
    --expression 
((Col2 LIKE '%' + @searchString + '%' OR Col3 LIKE '%' + @searchString + '%') OR @searchString = '')
AND
    --if your search requires a date you could do the following
(Cast(DateCol AS DATE) BETWEEN CAST(@dateParam AS Date) AND CAST(GETDATE() AS DATE) OR @dateParam = '')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top