我有一个可以返回 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 子句将执行任何操作,因为它对任何操作都起作用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top