ISNULL не работает в TSQL Select - PullRequest
0 голосов
/ 24 марта 2009

У меня есть TSQL SELECT, который может вернуть ноль. Я пытался использовать ISNULL, чтобы заменить его на 0, но по какой-то причине он не работает. Выбранная таблица имеет следующие столбцы:

  • storeID -> int
  • неустойка -> десятичная (9,2)
  • неустойка -> дата / время
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) 

Когда дата предшествует первой дате штрафа (когда должно быть 0 штрафа), результат не возвращается. Не уверен, почему это не работает. У меня есть работа вокруг, но это беспокоит меня.

Вот пример используемых данных:

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  

Ответы [ 3 ]

4 голосов
/ 24 марта 2009

Когда вы говорите «Когда дата предшествует первой дате штрафа», вы имеете в виду, когда значение @date меньше значения, возвращенного этим запросом?

SELECT MIN(penaltyDate)
FROM Penalty

Потому что тогда ваш внутренний запрос вернет ноль, и (если вы используете нули ANSI) эта часть вернет false,

WHERE (penaltyDate = ...

Потому что сравнения с нулем всегда возвращают ноль. Поэтому вместо выбора одной строки с нулевым значением вы выбираете без строк.

Приложение:

Чтобы подтвердить, что это проблема, измените первую строку вашего внешнего запроса на

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

Это будет работать из-за того, что я описал выше.

2 голосов
/ 24 марта 2009

Если @date <штрафная дата, то строка не возвращается, поэтому ISNULL не будет действовать. Возможно, вы захотите выбрать процент штрафа в переменной, а затем выбрать набор результатов <code>ISNULL(@pentaltyPercent).

0 голосов
/ 24 марта 2009

Есть ли у вас данные о том, что эта дата предшествует первой дате штрафа? Если ваш запрос не возвращает записи, ваше предложение IsNull сделает все, потому что оно работает против чего-либо.

...