除了可读性之外,在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)
答案 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)
在您的示例中,我认为性能可以忽略不计。但在其他情况下,根据你的除数的复杂性,答案是“它取决于”。
关于这个主题的为了便于阅读,我喜欢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]