ISNULL 在 TSQL Select 中不起作用
题
我有一个可以返回 null 的 TSQL SELECT。我尝试使用 ISNULL 将其替换为 0 但由于某种原因它不起作用。从中选择的表具有以下列:
- 商店ID --> 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
解决方案
当您说“当日期在第一个处罚日期之前”时,您的意思是当 @date
小于此查询返回的值?
SELECT MIN(penaltyDate)
FROM Penalty
因为这样你的内部查询将返回 null,并且(如果你使用 ANSI null)这部分将返回 false,
WHERE (penaltyDate = ...
因为与 null 的比较总是返回 null。因此,您不是选择具有空值的行,而是不选择任何行。
附录:
要确认这是问题所在,请将外部查询的第一行更改为
SELECT ISNULL(MAX(penaltyPercent),0.0) AS penaltyPercent
由于我上面所描述的,它会起作用。
其他提示
如果 @date <penaltyDate,则不会返回任何行,因此 ISNULL 没有可操作的值。您可能希望将惩罚百分比选择到变量中,然后选择到结果集中 ISNULL(@pentaltyPercent)
.
您是否确实拥有其日期早于第一个惩罚日期的数据?如果您的查询不返回记录,您的 IsNull 子句将执行任何操作,因为它对任何操作都起作用。
不隶属于 StackOverflow