Pregunta

Tengo un SELECT TSQL que puede devolver un valor nulo. He intentado utilizar ISNULL para sustituirla por 0 pero por alguna razón no está funcionando. La tabla de la selección de las siguientes columnas:

  • storeID -> int
  • penaltyPercent -> decimal (9,2)
  • penaltyDate -> fechaHora
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) 

Cuando la fecha es antes de la primera fecha de sanción (cuando debería ser 0 penalización), no se devuelve ningún resultado. No sé por qué esto no funciona. Tengo un trabajo alrededor pero me está molestando.

Este es un ejemplo de los datos que se utiliza:

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  
¿Fue útil?

Solución

Cuando se dice "Cuando la fecha es antes de la primera fecha de sanción", quiere usted decir cuando el valor de @date es menor que el valor devuelto por esta consulta?

SELECT MIN(penaltyDate)
FROM Penalty

Porque entonces su consulta interna va a devolver null, y (si está utilizando valores nulos ANSI) esta parte volverá falsa,

WHERE (penaltyDate = ...

Debido a que las comparaciones con nulo siempre vuelven nula. Así que en lugar de seleccionar una fila con un valor nulo, que está seleccionando ninguna fila.

Adición:

Para confirmar que este es el problema, cambie la primera línea de la consulta externa a

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

Se trabajará a causa de lo que he descrito anteriormente.

Otros consejos

Si @date ISNULL(@pentaltyPercent).

¿Usted realmente tiene datos que es la fecha está antes de la primera fecha de sanción? Si su consulta no devuelve registros, su cláusula EsNulo va a hacer nada, ya que funciona en contra de nada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top