Non IsNull lavorare in TSQL Select
Domanda
Ho un TSQL SELECT che può restituire un valore null. Ho provato ad utilizzare ISNULL sostituirlo con 0 ma per qualche motivo non funziona. La tabella di selezione da ha le seguenti colonne:
- storeID -> int
- penaltyPercent -> decimale (9,2)
- penaltyDate -> dateTime
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)
Quando la data è anteriore alla prima data di rigore (in cui ci dovrebbe essere 0 penalità), nessun risultato viene restituito. Non capisco perché questo non funziona. Ho un lavoro in giro, ma è bugging me.
Ecco un esempio dei dati in uso:
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
Soluzione
Quando si dice "Quando la data è anteriore alla prima data di rigore", vuoi dire quando il valore di @date
è inferiore al valore restituito da questa ricerca?
SELECT MIN(penaltyDate)
FROM Penalty
Perché allora la vostra query interna sta per restituire null, e (se si sta utilizzando null ANSI) questa parte restituirà falso,
WHERE (penaltyDate = ...
A causa paragoni con nulla ritornano sempre null. Così, invece di selezionare una riga con un valore nullo, si sta selezionando alcuna riga.
Addendum:
A conferma di ciò è il problema, modificare prima linea della query esterna a
SELECT ISNULL(MAX(penaltyPercent),0.0) AS penaltyPercent
Si lavorerà a causa di quello che ho descritto sopra.
Altri suggerimenti
Se @date
Avete in realtà dispone di dati che si tratta di data è prima della prima data di rigore? Se la query non restituisce i record, il tuo clausola IsNull farà di tutto perché funziona contro qualsiasi cosa.