2016-08-09 99 views
2

Wie kann ich diese Abfrage umstrukturieren, so dass es keine COALESCE oder ISNULL gibt? Kann ich es ändern, so dass es CASE verwendet? Gibt es eine andere Möglichkeit, es zu refaktorisieren?Coalesce mit Fall ersetzen

SELECT * FROM MockDb WHERE 
COALESCE(Column1,0) = @value1 AND 
COALESCE(Column2,0) = @value2 AND 
COALESCE(Column3,0) = @value3 AND 
COALESCE(Column4,0) = @value4 AND 
COALESCE(Column5,0) = @value5 
+0

'... wo (@ Wert1 ist null oder Column1 = @ Wert1) UND ... ' – jarlh

+3

Warum brauchen Sie diesen Ersatz? – Serg

+1

Welche Logik versuchen Sie zu implementieren? Das ist meiner Meinung nach eine ungewöhnliche Logik. –

Antwort

1

Dies scheint seltsame Logik - NULL Werte in den Spalten behandeln, als ob sie „0“ waren.

Sie schreiben:

where (column1 = @value1 or @value1 = 0 and column1 is null) and 
     (column2 = @value2 or @value2 = 0 and column2 is null) and 
     . . . 

Normalerweise ist die Sorge NULL Werte für die Parameter zu ermöglichen. Ich würde erwarten, Logik, um zu sehen, wie:

where (column1 = @value1 or @value1 is null) and 
     (column2 = @value2 or @value2 is null) and 
     . . . 

Diese Version NULL Werte im Parameter als „ignorieren Sie diese Spalte für Filterzwecke“ behandelt. Ihre Version behandelt NULL Werte in der Spalte selbst.

1

könnten Sie ersetzen

coalesce(column1, 0) 

mit

case when column1 is null then 0 else column1 end 

Sie jedoch eine andere Bedingung machen könnte:

([email protected]) OR (column1 is null AND @value1=0)