0

我有一个可以返回空值的 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  
4

3 回答 3

4

当您说“当日期在第一个处罚日期之前”时,您的意思是当 的值@date小于从该查询返回的值时?

SELECT MIN(penaltyDate)
FROM Penalty

因为你的内部查询将返回 null,并且(如果你使用 ANSI nulls)这部分将返回 false,

WHERE (penaltyDate = ...

因为与 null 的比较总是返回 null。因此,您没有选择任何行,而不是选择具有空值的一行。

附录:

要确认这是问题所在,请将外部查询的第一行更改为

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

由于我上面描述的内容,它将起作用。

于 2009-03-24T17:43:25.537 回答
2

如果@date < 惩罚日期,则不返回任何行,因此 ISNULL 没有值可根据。您可能希望将惩罚百分比选择到变量中,然后选择结果集ISNULL(@pentaltyPercent)

于 2009-03-24T17:44:24.597 回答
0

您是否真的有数据表明它的日期早于第一个惩罚日期?如果您的查询不返回记录,您的 IsNull 子句将执行任何操作,因为它适用于任何操作。

于 2009-03-24T17:45:10.680 回答