用SQL除以零

时间:2013-09-20 20:09:10

标签: sql sql-server

如果您选择此人的姓氏,此查询适用于每个测试用例:

SELECT P.Patient_ID, P.Person_FirstName, P.Person_LastName
    , H.Height
    , W.Weight
    , CASE
        when  H.Height is not null then W.Weight / (H.Height * H.Height)
        else null
     END as BMI
FROM 
    VIEW_BillPatient P
    LEFT JOIN H on P.Patient_ID = H.Patient_ID
    LEFT JOIN W on P.Patient_ID = W.Patient_ID  

WHERE   
    P.Person_LastName = 'ZZtest'

当H.Height为null或W.Weight为null时,这甚至有效。

不幸的是,只要我关闭WHERE子句并尝试为每个人运行它,我就会得到除零错误。

SELECT P.Patient_ID, P.Person_FirstName, P.Person_LastName
    , H.Height
    , W.Weight
    , CASE
        when  H.Height is not null then W.Weight / (H.Height * H.Height)
        else null
     END as BMI
FROM 
    VIEW_BillPatient P
    LEFT JOIN H on P.Patient_ID = H.Patient_ID
    LEFT JOIN W on P.Patient_ID = W.Patient_ID

错误:

Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.

(子查询H和W分别返回一个Patient_ID和数据库中高度或权重的最后一个值,因为通常记录的不止一个(如果没有找到则为null)。公式是计算体重索引中的索引)

我做错了什么? (MS SQL SERVER 2008-R2)

3 个答案:

答案 0 :(得分:2)

您可以使用nullif(expr1,expr2)

  

如果两个指定的表达式相等,则返回null值。

在这种情况下,如果BMInullheight0nullweight将为null

SELECT P.Patient_ID, P.Person_FirstName, P.Person_LastName
    , H.Height
    , W.Weight
    , W.Weight / nullif(H.Height * H.Height, 0) as BMI
FROM 
    VIEW_BillPatient P
    LEFT JOIN H on P.Patient_ID = H.Patient_ID
    LEFT JOIN W on P.Patient_ID = W.Patient_ID  

WHERE   
    P.Person_LastName = 'ZZtest

...或者只是更改您的案例条件以明确避免0。如果nullheight0nullweight

,您将获得null
SELECT P.Patient_ID, P.Person_FirstName, P.Person_LastName
    , H.Height
    , W.Weight
    , case when H.Height != 0 then W.Weight / (H.Height * H.Height) end as BMI
FROM 
    VIEW_BillPatient P
    LEFT JOIN H on P.Patient_ID = H.Patient_ID
    LEFT JOIN W on P.Patient_ID = W.Patient_ID  

WHERE   
    P.Person_LastName = 'ZZtest

答案 1 :(得分:0)

您的问题不是NULL值,而是零。

如果您尝试在NULL上进行数学运算,则会返回NULL

相反,你需要用零值

过滤出H.Height
WHEN H.Height>0 THEN ...

答案 2 :(得分:0)

将其更改为:

SELECT P.Patient_ID, P.Person_FirstName, P.Person_LastName
    , H.Height
    , W.Weight
    , CASE
        when  H.Height != 0 then W.Weight / (H.Height * H.Height)
        else null
     END as BMI
FROM 
    VIEW_BillPatient P
    LEFT JOIN H on P.Patient_ID = H.Patient_ID
    LEFT JOIN W on P.Patient_ID = W.Patient_ID

NULL!= 0已经为假,因此在这种情况下你会得到null,但你也会得到null为0。