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  
War es hilfreich?

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 ISNULL(@pentaltyPercent) wählen aus.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top