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“不支持加入表达式”有啥方法可以修复这个查询吗?
关闭 Access Jet OledbConnection 的最佳方式