VBA基础
Access 中IIF Switch Choose 3个函数的区别和使用方法
2017-05-24 23:01:24

作者:月亮的博客和大漠孤烟

先看定义

IIf,Switch和Choose

 

【1】IIf函数: 调用格式:IIf(条件式,表达式1,表达式2) 该函数是根据“条件式”的值来决定函数返回值。“条件值”为真,函数返回“表达式1”的值,否则返回“表达式2”的值。

【2】Switch函数: 调用格式:Switch(条件式1,表达式1[,条件式2,表达式2……[,条件式n,表达式n]]) 该函数是分别根据“条件式1”、“条件式2”直至“条件式n”的值来决定函数返回值。条件式是由左至右进行计算判断的,而表达式则会在第一个相关的条件式为True时作为函数的返回值返回。如果其中有部分不成对,则会产生一个运行错误。 

【3】Choose函数: 调用格式:Choose(索引式,选项11,选项2,...[,选项n]]) 该函数式根据“索引式”的值来返回选项列表中的某个值。“索引式”值为1,函数返回“选项1”值;“索引式”值为2,函数返回“选项2”值:依次类推。这里,只有在“索引式”的值界于1和可选项的项目数之间,函数才返回其后的选项值;当“索引式”的值小于1或大于列出的选择项数目时,函数返回无效值(Null)。

再说明一下Swith与Choose 不同的用法

Option ExplicitPrivate Sub Command1_Click()    'VB的Switch语句    Dim strKey            As String    Dim strGetValue       As String        strKey = "2"    strGetValue = Switch(strKey = "1", "a", strKey = "2", "b")    MsgBox strGetValue          '得到 bEnd SubPrivate Sub Command2_Click()    'VB的Choose语句    Dim strKey            As String    Dim strGetValue       As String            strKey = "3"    strGetValue = Choose(strKey, "a", "b", "c")    MsgBox strGetValue         '得到cEnd Sub

SELECT UserPassportID as PassportID, UserID, GrantorID, Case ObjectTypeID When 1 then ObjectID 

End as TerminalID, Type, Flag, GrantDate, Validate, Invalidate From UserPassport

在SQL里能执行,但在Access里总提示语法错误(操作符丢失).在查询表达式'Case ObjectTypeID 

When 1 then ObjectID End'中?

SQL:

select bb,cc,case aa when '一星级' then '*' 

when '二星级' then '** ' 

when '三星级' then '*** ' 

when '四星级' then '**** ' 

when '五星级' then '***** ' 

end 

from aaa

Access: 

select   bb,cc,iif(aa='一星级','*',iif(aa='二星级','**',iif(aa='三星级','***',iif(aa='四星级','****',iif(aa='五星级','*****'))))) from aaa;

前期在一网站应用中使用了IIF嵌套语法充分享受了它的魅力:

select Top 1 IIf(InStr(DownUrls,'http://')>0,Mid(DownUrls,InStr(DownUrls,'h')),IIf(InStr(DownUrls,'mms://')>0,Mid(DownUrls,InStr(DownUrls,'m')),Mid(DownUrls,InStr(DownUrls,'/')))) as VideoUrl from KS_DownLoad Order by Adddate

Access中程序流程函数有三个,Iif ,Switch 和 Choose。IIF的用法已经很常见了,网上搜一下大把打把的。这儿主要讲后面的两个:Switch和Choose。

Switch关键字

Access中没有Case When的用法,所以对于某些筛选比较就显得很吃力。不过还好,Access中有一个Switch可以解决这个问题。Switch 的语法是:SWITCH( case_1, result_1[, case_2, result_2...])。Switch的计算顺序为从左到右,将返回第一个为true的case对应的result。ACCESS对Switch有预编译(基本能够写进ACCESS的Sql都有预编译,ACCESS不支持Execute(SqlString)的用法),所以Switch中的条件和结果不能有逻辑错误和语法错误,否则不能执行。

实例:表tUser中有字段sex Text(1),用于存储用户性别,其中,如sex='m',用户为男性;sex='f',用户为女性;其他情况为保密。为了便于sql语句的说明,我们假设还有其他两个字段,userid和username。

在SqlServer中,如果要在搜索结果中直接显示性别的名称SexName(不是m/f之类的代码),使用Case When很方便。

SELECT UserID,               UserName,               SexName = WHEN LCASE(Sex)                 CASE 'm' THEN N'男'                CASE 'f' THEN N'女'                ELSE N'保密' ENDFROM tUser

ACCESS不支持WHEN CASE的用法。虽然不那么灵巧,但是用Switch可以解决这个问题。

SELECT UserID,              UserName,              SWITCH(               Sex = 'f',  '男',               Sex = 'm', '女',               True, '保密'               ) AS SexNameFROM tUser

上述中最后一个Case为true,该用法类似于When Case语法中的Else。

Choose关键字

对于Choose关键字的用法,暂时没有想到在它与SQLServer中的那个用法对应。

Choose函数的语法如下:Choose(Index,Choice_1[,Choice_2...])。其中,Index为从1开始的整数,Choice对应的是与Index相对应的选择项的值。

一时没有想到太好的例子,就用上面的那个关于用户性别的例子吧。假如上面的sex使用1替代m,代表男性,2替代f,代表女性。

SELECT UserID,              UserName,              IIF(CHOOSE(CINT(Sex),'男性','女性') IS NULL,                 '保密',                 CHOOSE(CINT(Sex),'男性','女性')                  ) AS SexNameFROM tUser

如果你说sex还是使用的m/f,那么怎么用

可以画蛇添足,使用Choose + Switch的嵌套啊。具体的嵌套代码我就不写了,没有什么价值,主要是在CInt(Sex)那儿嵌套,通过Switch对不同的Sex取不同的Index值。

实话实说,我还没有发现Choose有什么更好的意义。因为Index对应的Choice都是索引好的,就是说需要事先定义的。相对来说,这样就很不灵活 了。索引项都是一个一个写的(本文不讨论在数据库外生成Sql的情况),这很麻烦。功能上Switch可以满足它的所有功能,而且更灵活,逻辑更清晰。

SELECT code,SWITCH(

             mid(code,1,len(code)-2) = '',   '0',

             True,mid(code,1,len(code)-2)

             ) AS pcode

FROM   wz_cl order by code