IIf声明过于复杂

时间:2014-08-23 12:53:45

标签: 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"
    , 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"
                                  )
                                )
                              )
                            )
                          )
                        )
                      )
                    )
                  )
                )
              )
            )
          )
        )
      )
    )
  )
)

我想要三个输出,"接受" "拒绝"和"信息" ..

我怎样才能解决这个问题?

4 个答案:

答案 0 :(得分:3)

您有一组代码映射到“ACCEPTED”,另一组映射到“INFORMATION”。任何其他代码都应映射到“REJECTED”

使用下面的表来存储前两组的映射。然后,您可以使用DLookup检索前两组代码的 response_text 值。

DLookup("response_text", "YourTableNameHere", "response_code='" & [MIN CAR RESPONSE CODE] & "'")

对于“REJECTED”代码,DLookup将返回Null。因此,您可以使用Nz()“REJECTED”替换为Null。

Nz(DLookup("response_text", "YourTableNameHere", "response_code='" & [MIN CAR RESPONSE CODE] & "'"), "REJECTED")

类似的方法应该适用于Access VBA代码或从Access会话中运行的查询。如果您要在将在Access会话外部运行的查询中使用此功能,则可以使用IIf表达式而不是Nz

但是,如果这是针对查询的,请考虑将主数据表保持连接到映射表。那你甚至不需要DLookup ......

SELECT
    main.[MIN CAR RESPONSE CODE],
    Nz(ytnh.response_text, 'REJECTED') AS MIN_PASS_FAIL
FROM
    MainTable AS main
    LEFT JOIN YourTableNameHere AS ytnh
    ON main.[MIN CAR RESPONSE CODE] = ytnh.response_code;

映射表......

response_code response_text
0033          ACCEPTED
0037          ACCEPTED
0038          ACCEPTED
0039          ACCEPTED
0040          ACCEPTED
0055          ACCEPTED
0056          ACCEPTED
0061          ACCEPTED
0073          ACCEPTED
0013          INFORMATION
0018          INFORMATION
0019          INFORMATION
0028          INFORMATION
0045          INFORMATION
0046          INFORMATION
0047          INFORMATION
0048          INFORMATION
0060          INFORMATION

答案 1 :(得分:2)

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")))

答案 2 :(得分:2)

HansUp的回答肯定是最好的,因为你有很多项目要查找。我指出了另一种选择,因为它在其他情况下可能会很方便。

由于您始终在测试相同的字段,因此您可以使用SQL in运算符:

MIN_PASS_FAIL: IIf(
  [MIN CAR RESPONSE CODE] in (
    "0033"
  , "0037"
  , "0038"
  , ...
  )
, "ACCEPTED"
, Iif(
    [MIN CAR RESPONSE CODE] in (
      "0013"
    , "0018"
    , "0019"
    , ...
    )
  , "INFORMATION"
  , "REJECTED"
  )
)

in运算符测试值是否为值列表中的值。这使您的代码相对平坦。实际上,您可以使用Switch函数而不是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方便地面向表达式,所以你总是会回复一个价值。

答案 3 :(得分:0)

我会在visual basic中编写一个函数,然后从查询中调用它。比表查找快得多。 MIN_PASS_FAIL:GetResponseStatus([最小汽车响应代码])