Ms access IIf语句太复杂
我在MS Access 2003中尝试了一个相当长的IIf语句,但当我插嘴时,它告诉我它太复杂了:Ms access IIf语句太复杂,ms-access,if-statement,ms-access-2003,Ms Access,If Statement,Ms Access 2003,我在MS Access 2003中尝试了一个相当长的IIf语句,但当我插嘴时,它告诉我它太复杂了: MIN_PASS_FAIL: IIf( [MIN CAR RESPONSE CODE] = "0033" , "ACCEPTED" , IIf( [MIN CAR RESPONSE CODE] = "0037" , "ACCEPTED" , IIf( [MIN CAR RESPONSE CODE] = "0038" , "ACCEPTED" , II
MIN_PASS_FAIL: IIf(
[MIN CAR RESPONSE CODE] = "0033"
, "ACCEPTED"
, IIf(
[MIN CAR RESPONSE CODE] = "0037"
, "ACCEPTED"
, IIf(
[MIN CAR RESPONSE CODE] = "0038"
, "ACCEPTED"
, IIf(
[MIN CAR RESPONSE CODE] = "0039"
, "ACCEPTED"
, IIf(
[MIN CAR RESPONSE CODE] = "0040"
, "ACCEPTED"
, IIf(
[MIN CAR RESPONSE CODE] = "0055"
, "ACCEPTED"
, IIf(
[MIN CAR RESPONSE CODE] = "0056"
, "ACCEPTED"
, IIf(
[MIN CAR RESPONSE CODE] = "0061"
, "ACCEPTED"
, IIf(
[MIN CAR RESPONSE CODE] = "0073"
, "ACCEPTED"
, Iif(
[MIN CAR RESPONSE CODE] = "0013"
, "INFORMATION"
, Iif(
[MIN CAR RESPONSE CODE] = "0018"
, "INFORMATION"
, Iif(
[MIN CAR RESPONSE CODE] = "0019"
, "INFORMATION"
, Iif(
[MIN CAR RESPONSE CODE] = "0028"
, "INFORMATION"
, Iif(
[MIN CAR RESPONSE CODE] = "0045"
, "INFORMATION"
, Iif(
[MIN CAR RESPONSE CODE] = "0046"
, "INFORMATION"
, Iif(
[MIN CAR RESPONSE CODE] = "0047"
, "INFORMATION"
, Iif(
[MIN CAR RESPONSE CODE] = "0048"
, "INFORMATION"
, Iif(
[MIN CAR RESPONSE CODE] = "0060"
, "INFORMATION"
, "REJECTED"
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
我想要三个输出,“接受”、“拒绝”和“信息”
我怎样才能解决这个问题?您有一组代码映射到“已接受”,另一组代码映射到“信息”。任何其他代码都应映射到“已拒绝” 使用下面这样的表来存储前两个集合的映射。然后,您可以使用
DLookup
检索前两组代码的响应文本值
DLookup(“响应\文本”、“您的表名在此”、“响应\代码=”、[MIN CAR响应代码]&“”)
对于“已拒绝”代码,DLookup
将返回Null。因此,您可以使用Nz()
将“拒绝”替换为Null
新西兰(DLookup(“回复文本”、“YourTableNameHere”、“回复代码=”、[MIN CAR回复代码]&“”),“拒绝”)
类似的方法应适用于Access VBA代码或从Access会话中运行的查询。如果您将在访问会话外部运行的查询中使用此表达式,则可以使用IIf
表达式而不是Nz
但是,如果这是查询,请考虑将主数据表连接到映射表。那么你甚至不需要
DLookup
选择
主。[最小车辆响应代码],
Nz(ytnh.response_文本“拒绝”)为最低通过率
从…起
主表作为主表
左键作为ytnh在此处加入您的表名
在main上。[MIN CAR RESPONSE CODE]=ytnh.RESPONSE_CODE;
映射表
response\u code response\u text
0033接受
0037接受
0038接受
0039接受
0040接受
0055接受
0056接受
0061接受
0073接受
0013信息
0018信息
0019信息
0028资料
0045信息
0046信息
0047信息
0048信息
0060信息
一组代码映射到“已接受”,另一组代码映射到“信息”。任何其他代码都应映射到“已拒绝”
使用下面这样的表来存储前两个集合的映射。然后,您可以使用DLookup
检索前两组代码的响应文本值
DLookup(“响应\文本”、“您的表名在此”、“响应\代码=”、[MIN CAR响应代码]&“”)
对于“已拒绝”代码,DLookup
将返回Null。因此,您可以使用Nz()
将“拒绝”替换为Null
新西兰(DLookup(“回复文本”、“YourTableNameHere”、“回复代码=”、[MIN CAR回复代码]&“”),“拒绝”)
类似的方法应适用于Access VBA代码或从Access会话中运行的查询。如果您将在访问会话外部运行的查询中使用此表达式,则可以使用IIf
表达式而不是Nz
但是,如果这是查询,请考虑将主数据表连接到映射表。那么你甚至不需要
DLookup
选择
主。[最小车辆响应代码],
Nz(ytnh.response_文本“拒绝”)为最低通过率
从…起
主表作为主表
左键作为ytnh在此处加入您的表名
在main上。[MIN CAR RESPONSE CODE]=ytnh.RESPONSE_CODE;
映射表
response\u code response\u text
0033接受
0037接受
0038接受
0039接受
0040接受
0055接受
0056接受
0061接受
0073接受
0013信息
0018信息
0019信息
0028资料
0045信息
0046信息
0047信息
0048信息
0060信息
HansUp将其放入查找表的答案很好。特别是如果他们可能会改变。对于不需要查找表的答案,可以使用InStr函数。试试这个:
MIN_PASS_FAIL: IIF(InStr("0033.0037.0038.0039.0040.0055.0056",[MIN CAR RESPONSE CODE]),"ACCEPTED",IIf(InStr("0013.0018.0019.0028.0045.0046.0047.0048.0060",[MIN CAR RESPONSE CODE]),"ACCEPTED",IIf(InStr("0013.0018.0019.0028.0045.0046.0047.0048.0060",[MIN CAR RESPONSE CODE]),"INFORMATION","REJECTED")))
HansUp将其放入查找表的答案是好的。特别是如果他们可能会改变。对于不需要查找表的答案,可以使用InStr函数。试试这个:
MIN_PASS_FAIL: IIF(InStr("0033.0037.0038.0039.0040.0055.0056",[MIN CAR RESPONSE CODE]),"ACCEPTED",IIf(InStr("0013.0018.0019.0028.0045.0046.0047.0048.0060",[MIN CAR RESPONSE CODE]),"ACCEPTED",IIf(InStr("0013.0018.0019.0028.0045.0046.0047.0048.0060",[MIN CAR RESPONSE CODE]),"INFORMATION","REJECTED")))
HansUp的答案肯定是最好的,因为你有很多东西要查。我将指出另一种选择,因为它在其他情况下可能很方便 由于您总是测试同一字段,因此可以在操作符中使用SQL
:
MIN_PASS_FAIL: IIf(
[MIN CAR RESPONSE CODE] in (
"0033"
, "0037"
, "0038"
, ...
)
, "ACCEPTED"
, Iif(
[MIN CAR RESPONSE CODE] in (
"0013"
, "0018"
, "0019"
, ...
)
, "INFORMATION"
, "REJECTED"
)
)
中的运算符测试该值是否为值列表中的一个。这将使代码相对平坦。事实上,您可以使用开关
功能而不是Iif
功能将其完全展平:
MIN_PASS_FAIL: Switch(
[MIN CAR RESPONSE CODE] in (
"0033"
, "0037"
, "0038"
, ...
)
, "ACCEPTED"
, [MIN CAR RESPONSE CODE] in (
"0013"
, "0018"
, "0019"
, ...
)
, "INFORMATION"
, True
, "REJECTED"
)
您可以很容易地查找Switch
函数的详细信息,但基本上它的工作原理类似于其他语言中的case
语句或Switch
语句,但是SQL是方便的面向表达式的,所以您总是返回一个值。HansUp的答案肯定是最好的,因为您有很多项要查找。我将指出另一种选择,因为它在其他情况下可能很方便
由于您总是测试同一字段,因此可以在
操作符中使用SQL:
MIN_PASS_FAIL: IIf(
[MIN CAR RESPONSE CODE] in (
"0033"
, "0037"
, "0038"
, ...
)
, "ACCEPTED"
, Iif(
[MIN CAR RESPONSE CODE] in (
"0013"
, "0018"
, "0019"
, ...
)
, "INFORMATION"
, "REJECTED"
)
)
中的运算符测试该值是否为值列表中的一个。这将使代码相对平坦。事实上,您可以使用开关
功能而不是Iif
功能将其完全展平:
MIN_PASS_FAIL: Switch(
[MIN CAR RESPONSE CODE] in (
"0033"
, "0037"
, "0038"
, ...
)
, "ACCEPTED"
, [MIN CAR RESPONSE CODE] in (
"0013"
, "0018"
, "0019"
, ...
)
, "INFORMATION"
, True
, "REJECTED"
)
您可以很容易地查找Switch
函数的详细信息,但基本上它的工作原理类似于其他语言中的case
语句或Switch
语句,但SQL是方便的面向表达式的,因此您总是返回值。我会在visual Basic中编写一个函数