Access中的案例表达式

时间:2009-04-21 13:00:05

标签: sql ms-access

您可以在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

3 个答案:

答案 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语句涉及字符串,则此方法不起作用。