access转sql iif_Access中IIF,SWITCH,CHOOSE的使用技巧

在Access数据库中,很多SQL语句都是和sqlServer通用的。但是也有部分不能使用的函数两者是不相通的。

例如:

SELECT UserPassportID as PassportID, UserID  CaseObjectTypeID When1 thenObjectID

End as TerminalID, 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;

Access中Switch和Choose函数的用法

Access中程序流程函数有三个:Iif 、Switch、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'保密' END

FROM tUser

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

SELECT UserID,

UserName,

SWITCH(

Sex = 'f',   '男',

Sex = 'm', '女',

True, '保密'

) AS SexName

FROM tUser

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

Choose关键字

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 SexName

FROM 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值