Ich habe immer dynamische WHERE
Anweisungen mit COALESCE()
gemacht, um entweder den übergebenen Wert zurückgeben oder alle Datensätze zurückgeben.Wie mache ich eine dynamische WHERE mit COALESCE, die eine OR-Klausel hat
Allerdings kann ich es nicht tun, wenn ich gegen zwei Spalten überprüfen muss, und wenn ein Parameter nicht übergeben wurde dann alle Datensätze zurückgeben. Hier ist Schnipsel meines Code:
DECLARE @MaxAge INT = NULL --- Example value: 5
SELECT
*
FROM
dbo.Vehicle
WHERE
DATEPART(YEAR, RegistrationDate) <=
CASE
WHEN @MaxAge IS NOT NULL
THEN (DATEPART(YEAR,GETDATE()) - @MaxAge)
ELSE DATEPART(YEAR, RegistrationDate)
END
OR
DATEPART(YEAR, ProductionDate) <=
CASE
WHEN @MaxAge IS NOT NULL
THEN (DATEPART(YEAR,GETDATE()) - @MaxAge)
ELSE DATEPART(YEAR, ProductionDate)
END
Was ich versuche (in einfachem Englisch) zu tun ist:
Gib mir alle Zeilen in dem Fahrzeug Tisch, an dem dem Jahr Teil des RegistrationDate ist kleiner als der @MaxAge oder der YEAR-Teil des ProductionDate ist kleiner als der @MaxAge. Wenn @MaxAge NULL ist, dann gib mir die ganze Menge, egal wann es gemacht oder registriert wurde.
Manchmal ist der Wert in der Tabelle NULL, wenn ein Fahrzeug noch nicht registriert wurde. Manchmal kann die NULL sein, wenn der Verkäufer einfach nicht weiß, wann es gemacht wurde.
Was wäre der beste Weg, um dies anzugehen? Ich habe versucht, in SQL-Büchern und online zu suchen, aber kann wirklich nichts finden, um dieser Situation zu entsprechen.
Welche Version von SQL Server wird verwendet? Es gibt derzeit zwei. – Steven
So ist es möglich, dass ein Datensatz NULL registrationDate und NULL ProductionDate hat? Arbeitet Ihr Beispielcode überhaupt? – Aron
@Steven SQL Server 2014 Enterprise –