Question

J'ai un TSQL SELECT qui peut renvoyer une valeur nulle. J'ai essayé d'utiliser ISNULL de le remplacer par 0, mais pour une raison quelconque, il ne fonctionne pas. Le tableau de sélection a les colonnes suivantes:

  • storeID -> int
  • penaltyPercent -> décimal (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) 

Lorsque la date est avant la première date de pénalité (quand il devrait y avoir 0 pénalité), ne renvoie aucun résultat. Je ne sais pas pourquoi cela ne fonctionne pas. J'ai un travail autour mais il est me casser les pieds.

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  
Était-ce utile?

La solution

Quand vous dites « Lorsque la date est avant la première date de sanction », voulez-vous dire lorsque la valeur de est inférieure à @date la valeur renvoyée par 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 les comparaisons avec NULL renvoient toujours nulle. Ainsi, au lieu de sélectionner une ligne avec une valeur nulle, vous choisissez aucune ligne.

Addendum:

Pour confirmer 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.

Autres conseils

Si @date ISNULL(@pentaltyPercent).

Avez-vous des données réellement que c'est la date est avant la première date de sanction? Si votre requête ne renvoie pas les enregistrements, votre clause IsNull fera tout parce que cela fonctionne contre tout.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top