Isnull arbeiten nicht in TSQL Select
Frage
Ich habe eine TSQL SELECT, die eine Null zurückgeben kann. Ich habe versucht, ISNULL verwenden es mit 0 zu ersetzen, aber aus irgendeinem Grund nicht funktioniert. Die Tabelle der Auswahl von hat die folgenden Spalten:
- storeID -> int
- penaltyPercent -> dezimal (9,2)
- penaltyDate -> Datums- und Uhrzeit
SELECT ISNULL(penaltyPercent, 0.0) AS penaltyPercent
FROM dbo.Penalty
WHERE (penaltyDate = (SELECT MAX(penaltyDate) AS date
FROM dbo.Penalty AS Penalty_1
WHERE (penaltyDate <= @date) AND (storeID = @storeID))) AND
(storeID = @storeID)
Wenn das Datum vor dem ersten Strafe Datum ist (wenn es sollte 0 Strafe sein), wird kein Ergebnis zurückgegeben. Nicht sicher, warum dies nicht funktioniert. Ich habe eine Arbeit um, aber es nervt mich.
Hier wird eine Probe der Daten verwendet werden:
storeID penaltyDate penaltyPercent
182 10/1/2008 12:00:00 AM 0.020000
182 11/1/2008 12:00:00 AM 0.040000
182 12/1/2008 12:00:00 AM 0.070000
Lösung
Wenn Sie sagen, „Wenn das Datum vor dem ersten Strafe Zeitpunkt ist“, meinen Sie, wenn der Wert von @date
ist kleiner als der Wert von dieser Abfrage zurückgegeben?
SELECT MIN(penaltyDate)
FROM Penalty
Weil dann Ihre innere Abfrage wird null zurück, und (wenn Sie ANSI-Nullen verwenden) dieser Teil wird return false
WHERE (penaltyDate = ...
Da Vergleiche mit null zurück, immer null. Anstatt also eine Zeile mit einem Nullwert der Auswahl sind die Auswahl Sie keine Zeilen.
Nachtrag:
Um zu bestätigen, das das Problem ist, Ihre äußere erste Zeile Abfrage ändern
SELECT ISNULL(MAX(penaltyPercent),0.0) AS penaltyPercent
Es wird funktionieren, weil von dem, was ich habe oben beschrieben.
Andere Tipps
Wenn @date
Haben Sie tatsächlich Daten, die es ist Datum vor dem ersten Strafe Datum? Wenn die Abfrage nicht Datensätze zurück, Ihre IsNull Klausel wird alles tun, weil es gegen alles funktioniert.