您可以在Access中使用case
表达式吗?我正在尝试确定2列的最大日期,但在以下代码中不断出现语法错误:
CASE
WHEN dbo_tbl_property.LASTSERVICEDATE > Contour_dates.[Last CP12 Date]
THEN dbo_tbl_property.LASTSERVICEDATE
ELSE Contour_dates.[Last CP12 Date]
END AS MaxDate
答案 0 :(得分:51)
您可以改为使用IIF()
功能。
IIF(condition, valueiftrue, valueiffalse)
condition
是您要测试的值。
valueiftrue
是条件评估为TRUE时返回的值。
valueiffalse
是条件评估为FALSE时返回的值。
还有Switch
函数,当您有多个条件需要测试时,它更易于使用和理解:
Switch( expr-1, value-1 [, expr-2, value-2 ] … [, expr-n, value-n ] )
Switch函数参数列表由成对的表达式组成 值。表达式从左到右进行评估,并且 与要评估为True的第一个表达式关联的值是 回。如果部件配对不正确,则会出现运行时错误 发生。例如,如果expr-1为True,则Switch返回值-1。如果 expr-1为False,但expr-2为True,Switch返回值为2,等等 上。
如果出现以下情况,Switch会返回Null值:
所有表达式均为True。
第一个True表达式的对应值为Null。
注意:Switch会评估所有表达式,即使它只返回其中一个表达式。出于这个原因,你应该注意 不良副作用。例如,如果评价任何 表达式导致零除错误,发生错误。
答案 1 :(得分:9)
Access中没有case语句。相反,您可以使用switch语句。它看起来像下面的那样:
switch(dbo_tbl_property.LASTSERVICEDATE > Contour_dates.[Last CP12 Date],dbo_tbl_property.LASTSERVICEDATE,dbo_tbl_property.LASTSERVICEDATE <= Contour_dates.[Last CP12 Date],Contour_dates.[Last CP12 Date])
进一步阅读请看: http://www.techonthenet.com/access/functions/advanced/switch.php
或者对于VBA中的案例函数实现示例:
http://ewbi.blogs.com/develops/2006/02/adding_case_to_.html
此致 学家
答案 2 :(得分:0)
只要您处理数字,CASE
就是syntactic sugar。您可以将其替换为布尔乘法。
例如,CASE WHEN A = 1 THEN 2 ELSE 3 END
只是一种更好的书写方式
(-1) * ((A = 1) * 2 + (A <> 1) * 3)
({-1
是必需的,因为Microsoft Jet evaluates true boolean statements to -1。)
所以代替:
CASE
WHEN dbo_tbl_property.LASTSERVICEDATE > Contour_dates.[Last CP12 Date]
THEN dbo_tbl_property.LASTSERVICEDATE
ELSE Contour_dates.[Last CP12 Date]
END AS MaxDate
使用:
-1 * (
(dbo_tbl_property.LASTSERVICEDATE > Contour_dates.[Last CP12 Date]) * dbo_tbl_property.LASTSERVICEDATE +
(dbo_tbl_property.LASTSERVICEDATE <= Contour_dates.[Last CP12 Date]) * Contour_dates.[Last CP12 Date]
) AS MaxDate
遗憾的是,如果您的CASE语句涉及字符串,则此方法不起作用。