ISNULL не работает в TSQL Select
Вопрос
У меня есть TSQL SELECT, который может возвращать ноль.Я попытался использовать ISNULL, чтобы заменить его на 0, но по какой-то причине это не работает.Таблица выбора имеет следующие столбцы:
- идентификатор магазина --> целое число
- штрафПроцент --> десятичный (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
Решение
Когда вы говорите «Когда дата предшествует первой дате штрафа», вы имеете в виду, когда значение @date
меньше значения, возвращаемого этим запросом?
SELECT MIN(penaltyDate)
FROM Penalty
Потому что тогда ваш внутренний запрос будет возвращать значение null, и (если вы используете значения NULL ANSI) эта часть вернет false,
WHERE (penaltyDate = ...
Потому что сравнения с нулем всегда возвращают ноль.Таким образом, вместо выбора одной строки с нулевым значением вы не выбираете ни одной строки.
Приложение:
Чтобы убедиться, что проблема в этом, измените первую строку внешнего запроса на
SELECT ISNULL(MAX(penaltyPercent),0.0) AS penaltyPercent
Это будет работать благодаря тому, что я описал выше.
Другие советы
Если @date < penalDate, то строка не возвращается, поэтому для ISNULL нет значения, на которое можно было бы воздействовать.Возможно, вы захотите выбрать процент штрафа в переменной, а затем выбрать его в наборе результатов. ISNULL(@pentaltyPercent)
.
У вас действительно есть данные, что эта дата предшествует первой дате взыскания?Если ваш запрос не возвращает записи, ваше предложение IsNull сделает что угодно, потому что оно работает против чего угодно.