我有一个可以返回null的TSQL SELECT。我尝试使用ISNULL将其替换为0但由于某种原因它无法正常工作。选择的表格包含以下列:
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
答案 0 :(得分:4)
当您说“当日期早于第一个惩罚日期”时,您的意思是@date
的值是否小于此查询返回的值?
SELECT MIN(penaltyDate)
FROM Penalty
因为那时你的内部查询将返回null,并且(如果你使用ANSI nulls)这部分将返回false,
WHERE (penaltyDate = ...
因为与null的比较总是返回null。因此,不是选择具有空值的一行,而是选择无行。
附录:
要确认这是问题所在,请将外部查询的第一行更改为
SELECT ISNULL(MAX(penaltyPercent),0.0) AS penaltyPercent
由于我上面所描述的,它会起作用。
答案 1 :(得分:2)
如果@date&lt;惩罚日期,然后没有返回行,因此ISNULL没有任何值可以采取行动。您可能希望将惩罚百分比选择到变量中,然后选择结果集ISNULL(@pentaltyPercent)
。
答案 2 :(得分:0)
你真的有数据说它的日期是在第一个罚单日期之前吗?如果您的查询没有返回记录,您的IsNull子句将执行任何操作,因为它可以解决任何问题。