ISNULL não trabalhando em TSQL Select
Pergunta
Eu tenho um TSQL SELECT que pode retornar um valor nulo. Eu tentei usar o ISNULL para substituí-lo com 0, mas por algum motivo ele não está funcionando. A seleção da tabela de tem as seguintes colunas:
- storeID -> int
- penaltyPercent -> decimal (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 a data é antes da primeira data penalidade (quando não deve ser 0 penalidade), nenhum resultado é retornado. Não sei por que isso não funciona. Eu tenho um trabalho ao redor, mas ele está me incomodando.
Aqui está uma amostra dos dados que estão sendo utilizados:
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
Solução
Quando você diz "Quando a data é antes da primeira data pena", quer dizer, quando o valor de @date
é menor do que o valor retornado a partir desta consulta?
SELECT MIN(penaltyDate)
FROM Penalty
Porque então a sua consulta interna vai retornar nulo, e (se você estiver usando nulos ANSI) esta parte irá retornar falso,
WHERE (penaltyDate = ...
Porque comparações com nulo sempre retornar nulo. Então, ao invés de selecionar uma linha com um valor nulo, você está selecionando nenhuma linha.
Adenda:
Para confirmar este é o problema, altere a primeira linha do seu consulta externa para
SELECT ISNULL(MAX(penaltyPercent),0.0) AS penaltyPercent
Ela vai trabalhar por causa do que eu descrevi acima.
Outras dicas
Se @date
Você realmente tem dados que é data é antes da primeira data pena? Se a consulta não retornar registros, a sua cláusula de IsNull vai fazer nada porque funciona contra qualquer coisa.