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  
È stato utile?

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 ISNULL(@pentaltyPercent).

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top