Microsoft SQL:CASE WHEN vs ISNULL / NULLIF

时间:2009-05-13 13:13:06

标签: sql-server null

除了可读性之外,在SQL中防止除以0错误时使用CASE WHEN语句与ISNULL / NULLIF有什么显着的好处吗?

CASE WHEN (BeginningQuantity + BAdjustedQuantity)=0 THEN 0 
ELSE EndingQuantity/(BeginningQuantity + BAdjustedQuantity) END

VS

ISNULL((EndingQuantity)/NULLIF(BeginningQuantity + BAdjustedQuantity,0),0)

6 个答案:

答案 0 :(得分:7)

请记住,NULL与0不同。因此,问题中的两个代码段可以为同一输入返回不同的结果。

例如,如果BeginningQuantity为NULL,则第一个表达式的计算结果为NULL:

CASE WHEN (NULL + ?)=0 THEN 0 ELSE ?/(NULL + ?) END

Now(NULL +?)等于NULL,NULL = 0为false,因此计算ELSE子句,给出?/(NULL +?),结果为NULL。但是,第二个表达式变为:

ISNULL((?)/NULLIF(NULL + ?,0),0)

这里是NULL +?变为NULL,并且因为NULL不等于0,所以NULLIF返回第一个表达式,即NULL。外部ISNULL捕获此并返回0.

所以,请下定决心:你是用零来防止divison,还是用NULL来区分? ; - )

答案 1 :(得分:3)

在您的示例中,我认为性能可以忽略不计。但在其他情况下,根据你的除数的复杂性,答案是“它取决于”。

关于这个主题的

Here is an interesting blog

为了便于阅读,我喜欢Case / When。

答案 2 :(得分:0)

在我看来,使用Isnull / Nullif比使用Case When更快。我更喜欢isnull / nullif。

答案 3 :(得分:0)

我会使用ISNULL,但尝试将其格式化以便更好地显示其含义:

SELECT
    x.zzz
        ,x.yyyy
        ,ISNULL(
                   EndingQuantity / NULLIF(BeginningQuantity+BAdjustedQuantity,0)
                ,0)
        ,x.aaa
    FROM xxxx...

答案 4 :(得分:0)

CASE WHEN (coalesce(BeginningQuantity,0) + coalesce(BAdjustedQuantity,0))=0 THEN 0 ELSE coalesce(EndingQuantity,0)/(coalesce(BeginningQuantity,0) + coalesce(BAdjustedQuantity,0)) END

你最好的选择imho

答案 5 :(得分:0)

对不起,这是更简化的upbuilded sql查询。

SELECT 

(ISNULL([k1],0) + ISNULL([k2],0)) /

CASE WHEN (
(
   CASE WHEN [k1] IS NOT NULL THEN 1 ELSE 0 END +
   CASE WHEN [k2] IS NOT NULL THEN 1 ELSE 0 END
) > 0 )
THEN
(
  CASE WHEN [k1] IS NOT NULL THEN 1 ELSE 0 END +
  CASE WHEN [k2] IS NOT NULL THEN 1 ELSE 0 END
)
ELSE 1 END

FROM dbo.[Table]