SQL Coalesce in WHERE-Klausel

Ich versuche, optionale Parameter in einer gespeicherten Prozedur zu implementieren, die ich habe, aber ich laufe auf ein Problem. Hier ist eine vereinfachte Abfrage, um das Problem zu veranschaulichen:

SET ANSI_NULLS OFF

DECLARE @MiddleName VARCHAR(20);
SET @MiddleName = NULL;

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND [MiddleName] = COALESCE(@MiddleName, [MiddleName])

Wenn ich diese Abfrage ausführe, muss ich eine Zeile zurückbekommen, da ein Torres NULL in der Spalte [MiddleName] hat. Die Abfrage gibt jedoch null Zeilen zurück. Die Verwendung von IFNULL() erzeugt das gleiche Ergebnis. Bei der Recherche zu COALESCE hatte ich den Eindruck, dass NULL zurückgegeben würde, wenn alle Ausdrücke NULL sind. Da ich kein SQL-Experte bin, gehe ich davon aus, dass mir etwas fehlt, aber was ist es.....

Vielen Dank im Voraus für jede Hilfe.

Antwort auf "SQL Coalesce in WHERE-Klausel " 4 von antworten

Versuchen Sie, dies zu tun?

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND ([MiddleName] = @MiddleName OR @MiddleName IS NULL)

Nach dem, was ich verstehe, sieht es so aus.

Das Problem ist, dass in sql ,WHERE Null = Null" nie Zeilen zurückgegeben wird, da Null sich nicht gleichstellt.

Sie müssen

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND ( @MiddleName IS NULL OR [MiddleName] = @MiddleName )
tun

Ihr COALESCE returns gibt NULL when the zurück, wenn der Parameter @MiddleName parameter and the und die Spalte MiddleName column are both beide NULL, but the test will evaluate to false because sind, aber der Test wird als false ausgewertet, da a NULL does not equal any other does not equal any other NULL . .

Um dies zu umgehen, sollten Sie den Parameter @MiddleName parameter for nullity: explizit auf Nichtigkeit testen:

SELECT *
FROM [Customer]
WHERE [LastName] = 'Torres'
    AND (@MiddleName IS NULL OR [MiddleName] = @MiddleName)

Sie geben an, dass Sie nach der Abfrage suchen, um die Zeile zurückzugeben, in der das Feld MiddleName NULL ist. Leider (NULL = NULL) gibt nicht true, es gibt NULL zurück.

Du brauchst so etwas wie...

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND ([MiddleName] = @MiddleName OR @MiddleName IS NULL)