3

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

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 服务器 2008-R2)

4

3 回答 3

2

你可以使用nullif(expr1,expr2).

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

在这种情况下,BMI将是nullif heightis0nullor if weightisnull

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. 你会得到null如果height0null如果weightnull

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
于 2013-09-20T20:17:56.020 回答
0

您的问题不在于 NULL 值,而在于零。

如果您尝试对 a 进行数学运算NULL,它将返回 a NULL

相反,您需要过滤掉具有零值的 H.Height

WHEN H.Height>0 THEN ...
于 2013-09-20T20:13:43.803 回答
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,但你也会得到 0 的 null。

于 2013-09-20T20:15:49.323 回答