【问题标题】:Access/jet equivalent of Oracle's decodeAccess/jet 相当于 Oracle 的解码
【发布时间】:2009-11-19 13:17:33
【问题描述】:

在 Access(或 Jet,就此而言)中,Oracle 的 decode() 是否有等价物。

我面临的问题是:我应该基本上根据 最后是状态和日期(所有记录的状态 = 2)。

在甲骨文我会去类似

select
  ...
from
  ...
where
  ..
order by
  decode(status, 2, 0, 1),
  date_column

【问题讨论】:

  • 您可以在 VBA 中编写自定义函数,然后从 SQL 中调用它。如果您有复杂的选择,这可能更可取,否则下面的 Switch 或 Iif 解决方案是最好的。

标签: sql oracle ms-access jet


【解决方案1】:

最接近的类比是SWITCH() 函数,例如

甲骨文:

SELECT supplier_name,
       decode(supplier_id,  10000, 'IBM',
                            10001, 'Microsoft',
                            10002, 'Hewlett Packard',
                                   'Gateway') result
  FROM suppliers;

访问数据库引擎

SELECT supplier_name,
       SWITCH(supplier_id = 10000, 'IBM',
              supplier_id = 10001, 'Microsoft',
              supplier_id = 10002, 'Hewlett Packard',
              TRUE, 'Gateway') AS result
  FROM suppliers; 

请注意,对于SWITCH() 函数,您每次都必须提供完整的谓词,因此您不限于仅使用supplier_id。对于默认值,使用对人类读者来说很明显的谓词是 TRUE,例如1 = 1 或者实际上只是 TRUE :)

可能不太明显的是SWITCH() 函数中的逻辑不会短路,这意味着函数中的每个表达式都必须能够无错误地进行评估。如果您需要逻辑短路,那么您将需要使用嵌套的IIF() 函数。

【讨论】:

  • 在 Access-2010 中,SQL 中的 IIF 函数不是短路。基于文档和经验测试。
  • @user36800 ...但如果你有证据证明它不能短路,那么请以某种方式发布,我保证会测试它:)
  • Access db引擎实现中的IIf函数确实短路了; VBA IIf 没有。如果@user36800 想凭经验确认这一点,那很容易。在 Access 查询中,SELECT IIf(True,2,1/0) 返回 2。在 VBA 中,相同的 IIf 表达式会触发运行时错误 11:“除以零”
  • 在我的错误评论两年后,我现在遇到了这个问题。是的,经验测试表明 SQL IIF 是短路的(我使用的是 SQL 92)。这正是我现在需要的行为。
【解决方案2】:

您可以尝试使用 IIF。请参阅thisstackoverflow 问题。

【讨论】:

    【解决方案3】:

    我认为它可能会比较切换或选择。

    Switch(expr-1, value-1[, expr-2, value-2 … [, expr-n,value-n]])
    

    -- http://office.microsoft.com/en-us/access/HA012289181033.aspx

    Choose(index, choice-1[, choice-2, ... [, choice-n]])
    

    -- http://msdn.microsoft.com/en-us/library/aa262690%28VS.60%29.aspx

    【讨论】:

      【解决方案4】:

      你可以使用SWITCH函数:

      LABEL: Switch(
         [TABLE_NAME]![COL_NAME]='VAL1';'NEW_VAL1';
         [TABLE_NAME]![COL_NAME]='VAL2';'NEW_VAL2';
      )
      

      注意分号而不是逗号。

      以上示例适用于 MS Access 2010 中的查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-23
        • 1970-01-01
        • 1970-01-01
        • 2012-02-21
        • 2018-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多