【问题标题】:What is the equivalent of Select Case in Access SQL?Access SQL 中 Select Case 的等价物是什么?
【发布时间】:2013-03-24 08:03:26
【问题描述】:

我有一个查询,其中包括名为 openingbalancecommissions 的字段。我想根据 openingbalance 计算 commissions 的值,类似于 Access VBA 中的 Select Case 块:

Select Case OpeningBalance
   Case 0 To 5000
        commission = 20
   Case 5001 To 10000
        commission = 30
   Case 10001 To 20000
        commission = 40
   Case Else
        commission = 50
End Select

但是由于 Access 不允许在查询中使用 Select Case,我如何才能在 Access SQL 中实现我的目标?

【问题讨论】:

    标签: ms-access select-case


    【解决方案1】:

    Switch Function 视为多个IIf() 表达式的替代方案。它将返回表达式计算为 True 的第一个表达式/值对的值,并忽略任何剩余的对。该概念类似于您引用的 SELECT ... CASE 方法,但在 Access SQL 中不可用。

    如果要将计算字段显示为commission

    SELECT
        Switch(
            OpeningBalance < 5001, 20,
            OpeningBalance < 10001, 30,
            OpeningBalance < 20001, 40,
            OpeningBalance >= 20001, 50
            ) AS commission
    FROM YourTable;
    

    如果您想将该计算值存储到名为 commission 的字段中:

    UPDATE YourTable
    SET commission =
        Switch(
            OpeningBalance < 5001, 20,
            OpeningBalance < 10001, 30,
            OpeningBalance < 20001, 40,
            OpeningBalance >= 20001, 50
            );
    

    无论哪种方式,看看您是否觉得Switch() 更易于理解和管理。随着条件数量的增加,多个IIf()s 可能会变得令人难以置信。

    【讨论】:

    • HansUp 你是最棒的。开关功能很好用。谢谢
    • SWITCH() 只能在 Access SQL 中使用的 VBA 函数之一在从内部执行时 Access 本身(如 Nz()),还是它也可以工作当您使用 JET Red OLE-DB/ODBC 或 ACE 驱动程序时?
    • 既然是available in sandbox mode,我认为它应该适用于任何查询,无论查询是否在 Access 会话中运行。
    【解决方案2】:

    你可以这样做:

    select
    iif ( OpeningBalance>=0 And OpeningBalance<=500 , 20, 
    
                      iif ( OpeningBalance>=5001 And OpeningBalance<=10000 , 30, 
    
                           iif ( OpeningBalance>=10001 And OpeningBalance<=20000 , 40, 
    
    50 ) ) ) as commission
    from table
    

    【讨论】:

      【解决方案3】:

      您可以使用 IIF 获得类似的结果。

      请注意,您可以嵌套 IIF 语句来处理多种情况。这里有一个例子:http://forums.devshed.com/database-management-46/query-ms-access-iif-statement-multiple-conditions-358130.html

      SELECT IIf([Combinaison] = "Mike", 12, IIf([Combinaison] = "Steve", 13)) As Answer 
      FROM MyTable;
      

      【讨论】:

      • 感谢 RedFilter 的回复,这非常适合我正在处理的另一个查询,我只需要组合 2 个 if 语句。由于我刚开始使用 Access 4 个月前,我认为 HansUp 建议的开关功能更易于阅读。
      • 派对很晚,但值得注意的是:使用IIf时要小心,因为所有部分(测试、真结果和假结果)都已执行通话中。因此,如果您在 IIf 中有任何函数调用,例如 - SELECT IIf(Process([Combinaison]) = "Mike", 12, IIf(Process([Combinaison]) = "Steve", 13)) As Answer ...,并且这些函数更改 任何值,那么效果将发生两次 - 每次调用一次。 docs.microsoft.com/en-us/office/vba/Language/Reference/…
      猜你喜欢
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 2013-10-16
      相关资源
      最近更新 更多