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  
Foi útil?

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 ISNULL(@pentaltyPercent) conjunto de resultados.

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top