No isnull trabajar en TSQL Seleccionar
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
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
¿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.