2009-03-24 11 views
0

Ich habe eine TSQL SELECT, die eine Null zurückgeben kann. Ich habe versucht, ISNULL zu verwenden, um es durch 0 zu ersetzen, aber aus irgendeinem Grund funktioniert es nicht. Die Tabelle Auswählen aus hat die folgenden Spalten:ISNULL funktioniert nicht in TSQL Wählen

  • storeID -> int
  • penaltyPercent -> DECIMAL (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 Strafdatum liegt (wenn es eine Strafe von 0 geben sollte), wird kein Ergebnis zurückgegeben. Nicht sicher, warum das nicht funktioniert. Ich habe eine Arbeit, aber es nervt mich. Hier

ist eine Probe der Daten verwendet wird:

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 
+0

formatieren Sie Ihre Antwort, es ist eindeutig auf diese Weise – eKek0

+0

Danke allen, von einem relativen SQL-Noob. – monkeypushbutton

Antwort

4

Wenn Sie sagen, „Wenn das Datum vor dem ersten Strafe Zeitpunkt ist“, meinen Sie, wenn der Wert von @date kleiner als der Wert zurückgegeben von dieser Abfrage?

SELECT MIN(penaltyDate) 
FROM Penalty 

Denn dann Ihre innere Abfrage wird null zurück, und (wenn Sie ANSI-Nullen verwenden) dieser Teil false zurück

WHERE (penaltyDate = ... 

Da Vergleiche mit null immer null zurück. Anstatt also eine Zeile mit einem Nullwert auszuwählen, wählen Sie keine Zeilen aus.

Nachtrag:

Um zu bestätigen, das das Problem ist, Ihre äußere erste Zeile der Abfrage ändern, um

SELECT ISNULL(MAX(penaltyPercent),0.0) AS penaltyPercent 

es wegen arbeiten, was ich oben beschrieben habe.

+0

Die innere Abfrage gibt nicht null zurück, sie gibt eine leere Ergebnismenge zurück. –

+0

@P Papa: Ich habe es mit SQL Server 2000 getestet. Zu meiner Überraschung gibt es tatsächlich Null in dieser Situation. Ich erwartete, dass die innere Abfrage keine Datensätze zurückgibt, aber sie gibt null zurück. Die äußere Abfrage gibt jedoch keine Datensätze zurück. – Welbog

+0

Ich stehe korrigiert. –

2

Wenn @date < penaltyDate, dann wird keine Zeile zurückgegeben, daher gibt es keinen Wert für ISNULL. Sie möchten möglicherweise den Penalty-Prozentsatz in eine Variable auswählen und dann die Ergebnismenge ISNULL(@pentaltyPercent) auswählen.

0

Haben Sie tatsächlich Daten, deren Datum vor dem ersten Penalty Date liegt? Wenn Ihre Abfrage keine Datensätze zurückgibt, wird Ihre IsNull-Klausel alles tun, weil sie gegen alles funktioniert.