Access/jet 相当于 Oracle 的解码

Posted

技术标签:

【中文标题】Access/jet 相当于 Oracle 的解码【英文标题】:Access/jet equivalent of Oracle's decode 【发布时间】: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 解决方案是最好的。 【参考方案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。请参阅this*** 问题。

【讨论】:

【参考方案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 中的查询。

【讨论】:

以上是关于Access/jet 相当于 Oracle 的解码的主要内容,如果未能解决你的问题,请参考以下文章

MS Access Jet 数据库以编程方式紧凑

MS Access/JET“不支持加入表达式”有啥方法可以修复这个查询吗?

关闭 Access Jet OledbConnection 的最佳方式

access2003表格中不允许出现的字,比如说工作,应该怎么样设置。

oracle通过警告解码组

Oracle解码函数