替换switch /嵌套的IIf语句

时间:2014-08-20 20:18:43

标签: sql ms-access

我有一个包含ICD代码字段的表(死亡分类代码)。我想根据ICD代码创建另一个解码死因的字段。以下是我使用的一些代码作为参考:
癌症:任何以字母" C"和所有代码" D00-D49"开头的东西;
心脏病:" I20-I52"
糖尿病:" E10-E14"
事故:任何以字母开头的东西" V"和" W",所有代码" X00-X59"

代码最长可达4个字符,因此心脏病代码包括I201,I313等。

无论如何,我创建了一个查询来添加一个解码死因的字段,看起来像这样(CAUSE是带有ICD代码的字段):

SELECT CAUSE, 
IIf(Left([CAUSE],1) In ('C'),"Cancer",
IIf(Left([CAUSE],2) In ('D0','D1','D2','D3','D4'),"Cancer",
IIf(Left([CAUSE],3) In ('G30'),"Alzheimer's disease",
IIf(Left([CAUSE],2) In ('I2','I3','I4'),"Heart Disease",
IIf(Left([CAUSE],3) In ('I51','I52'),"Heart Disease",
IIf(Left([CAUSE],2) In ('I6'),"Cerebrovascular disease",
IIf(Left([CAUSE],3) In ('E10','E11','E12','E13','E14'),"Diabetes",
IIf(Left([CAUSE],3) In ('J09','J10','J11','J12'),"Influenza/Pneumonia",
IIf(Left([CAUSE],3) In ('J40','J41'), "Chronic Lower Respiratory Diseases",
IIf(Left([CAUSE],2) In ('X6','X7'),"Suicide",
IIf(Left([CAUSE],3) In ('X80','X81','X82','X83','X84'),"Suicide",
IIf(Left([CAUSE],1) In ('V','W'),"Accident",
IIf(Left([CAUSE],2) In ('X0','X1','X2','X3','X4','X5'),"Accident",
"Other"
))))))))))))) 
AS SpecCause
FROM ALLDeaths;

这个特殊的代码可以工作,但是如果我添加另一行,我得到的#34;查询表达式对于表达式来说过于复杂"错误。 Switch功能也是如此。

SELECT cause,
SWITCH(
cause LIKE 'C*', "Cancer",
cause = 'G30', "Alzheimer's Disease",
cause LIKE 'I2*', "Heart Disease",
cause LIKE 'I6*', "Cerebrovascular disease",
cause LIKE 'E10*', "Diabetes",
cause LIKE 'E11*', "Diabetes",
cause LIKE 'E12*', "Diabetes",
cause LIKE 'E13*', "Diabetes",
cause LIKE 'E14*', "Diabetes",
cause LIKE 'W*', "Accident"
)
AS SpecCause
FROM ALLDeaths;

上面的代码有效,但是如果我添加另一行,我会得到相同的"查询过于复杂,无法表达"错误。有没有我可以使用的替代方案,允许我解码所有ICD值而没有限制?

2 个答案:

答案 0 :(得分:4)

我建议完全跳过代码,只使用2列查找表。它可能看起来像:

Code CauseOfDeath
E10  Diabetes
E11  Diabetes
G30  Alzheimers Disease
...

(由于code的长度不尽相同,您可以使用Like代替=加入{。}

编辑:在您的陈述中,您尝试使用' C'来节省一些空间。对于所有癌症。这里理想的解决方案是将每个 ICD代码输入此表。

答案 1 :(得分:0)

我会使用另一个带有ID / sequence,description,loCode和hiCode的表。然后,您可以使用loCode和hiCode之间的代码搜索所有行(如果有)。