2009-03-24 10 views
0

J'ai un SELECT TSQL qui peut retourner une valeur nulle. J'ai essayé d'utiliser ISNULL pour le remplacer par 0 mais pour une raison quelconque cela ne fonctionne pas. Le tableau de la sélection comporte les colonnes suivantes:ISNULL ne fonctionne pas dans TSQL Sélectionnez

  • storeID -> int
  • penaltyPercent -> décimal (9,2)
  • penaltyDate -> dateHeure
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) 

Lorsque la date est antérieure à la première date de pénalité (où il devrait y avoir une pénalité de 0), aucun résultat n'est retourné. Je ne sais pas pourquoi cela ne fonctionne pas. J'ai un travail mais ça m'embête.

Voici un échantillon des données utilisées:

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

formatez votre réponse, il est clairement de cette façon – eKek0

+0

Merci à tous, d'un SQL relatif noob. – monkeypushbutton

Répondre

4

Quand vous dites « Lorsque la date est avant la première date de sanction », voulez-vous dire lorsque la valeur de @date est inférieure à la valeur retournée de cette requête?

SELECT MIN(penaltyDate) 
FROM Penalty 

Car alors votre requête interne va revenir nulle, et (si vous utilisez ANSI nulls) cette partie retournera false,

WHERE (penaltyDate = ... 

Parce que des comparaisons avec NULL renvoient toujours nulle. Ainsi, au lieu de sélectionner une ligne avec une valeur nulle, vous ne sélectionnez aucune ligne.

Addendum:

Pour confirmer c'est le problème, modifiez votre première ligne de requête externe à

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

Il fonctionnera en raison de ce que je viens de décrire ci-dessus.

+0

La requête interne ne renvoie pas de valeur nulle, elle renvoie un jeu de résultats vide. –

+0

@P Daddy: Je l'ai testé avec SQL Server 2000. À ma grande surprise, il retourne effectivement null dans cette situation. Je m'attendais à ce que la requête interne ne retourne aucun enregistrement, mais elle renvoie null. La requête externe ne renvoie aucun enregistrement, cependant. – Welbog

+0

Je suis corrigé. –

2

Si @date < penaltyDate, il n'y a pas de ligne retournée, donc il n'y a pas de valeur sur laquelle ISNULL doit agir. Vous pouvez sélectionner le pourcentage de pénalité dans une variable, puis sélectionner l'ensemble de résultats ISNULL(@pentaltyPercent).

0

Avez-vous des données indiquant que la date est antérieure à la première date de pénalité? Si votre requête ne renvoie pas d'enregistrements, votre clause IsNull fera n'importe quoi car elle fonctionne contre tout.