ISNULL无法在TSQL Select中工作

时间:2009-03-24 17:33:56

标签: tsql select isnull

我有一个可以返回null的TSQL SELECT。我尝试使用ISNULL将其替换为0但由于某种原因它无法正常工作。选择的表格包含以下列:

  • storeID - > int
  • penaltyPercent - >小数(9,2)
  • penaltyDate - >日期时间
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 个答案:

答案 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子句将执行任何操作,因为它可以解决任何问题。