如果您选择此人的姓氏,此查询适用于每个测试用例:
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)
答案 0 :(得分:2)
您可以使用nullif(expr1,expr2)
。
如果两个指定的表达式相等,则返回null值。
在这种情况下,如果BMI
为null
或height
或0
为null
,weight
将为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
。如果null
为height
或0
或null
为weight
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.HeightWHEN 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。