Previous topicNext topic
WebBuilderX > 子页面组件元素 > 表格类元素 > 列表达式 > 表达式方式创建 >
条件判断函数

SQL语句中的条件判断函数,Access和SQLServer是完全不同的:Access常用的是iif、switch和choose函数,而SQLServer使用的则是case表达式。不论是函数还是表达式,它们起到的作用是相同的,且都有返回值。

例如,之前在“表达式规则”中多次用到的iif,这种写法只能放到Access数据源中,放到SQLServer中就会出现错误。

先看看iif函数的用法:如果条件成立,就返回第1个值,否则返回第2个值。

例如,为避免“折扣”列为空时导致无法得到计算结果,以下语句就用了2个iif:
    iif(iif([折扣] is null,0,[折扣])<0.2,'折扣太低','折扣正常')
    上述语句中所嵌套的空值判断,如果改用isnull函数,可以这样写:
    iif(isnull([折扣]),0,[折扣]) < 0.2
    以下iif语句就更加复杂一些:
    iif(iif([折扣] is null,0,[折扣])<0.1,'不到1折',iif(iif([折扣] is null,0,[折扣])>0.3,'大于3折','1-3折'))
    该代码的意思是,如果折扣列的值小于0.1,返回的内容是“不到1折”;如果大于0.3,返回“大于3折”;在0.1和0.3之间的,返回“1-3折”。很显然,如果将该逻辑判断再加上0.4、0.5、0.6等各种折扣情况,使用iif函数写起来就太麻烦了。

为此,Access又专门增加了Switch函数。如果改用Switch函数来写,上面同样计算效果的语句就会变得非常清晰:
    switch(折扣 is null or 折扣<0.1,'不到1折',折扣 between 0.1 and 0.3,'1-3折',折扣>0.3,'大于3折')
    由此可见,Switch函数中的判断与返回值都是成对出现的:每做一次判断就要给出一个返回值,而且可以根据需要随意增加。

除此之外,与Switch相类似的还有一个Choose函数,该函数是根据一个表达式的计算结果,来决定返回哪个位置的值。请注意,这里的表达式返回值必须是整数,小数的话将直接舍弃小数部分。例如:
    choose(iif(折扣 is null,0,折扣)*10,'1折','2折','3折')
    为什么要在上述语句中的判断表达式中乘以10?这是因为,“订单”表中的折扣列数据全部小于1,这样它就在Choose函数中找不到对应位置的值了。为了得到大于1的数据,以便和后面的序列化位置相对应,只能将其乘以10。当折扣为0.1时,乘以10以后得到的值为1,因此取位置为1的返回值就是“1折”;0.33乘以10以后得到的值是3.3,那就取位置为3的返回值。其它同理。
    可是,当折扣为空的时候呢?或者该列的值是负数呢?那就需要在Choose外面再嵌套其它函数。因此,Choose函数仅在对一些序列化的整数进行判断时才会使用,平时使用频率最高的还是IIF、Switch函数。

  • SQLServer中的判断语句

SQLServer使用Case…End语句来进行条件判断。请注意,这个不是函数,它就是一个条件表达式,且必须以Case开头、以End结束,起到的效果和Access中的函数是相同的。Case…End语句有两种写法。

第一种语法格式,根据指定表达式的具体值进行判断
    Case 表达式
        When 比较值1 Then 返回值1
        When 比较值2 Then 返回值2
        When 比较值3 Then 返回值3
        ……
    Else 默认返回值
    End
    当表达式等于“比较值1”时,则得到“返回值1”;当表达式等于“比较值2”时,则得到“返回值2”,其余类推。当比较结束,没有符合的比较值时,则得到默认返回值。例如,同样对“订单”表中的折扣列进行判断:
    case isnull([折扣],0)
        when 0 then '无折扣'
        when 0.1 then '1折'
        when 0.2 then '2折'
        when 0.3 then '3折'
    else '其他折扣'
    end
    很显然,以上这种写法很难穷尽折扣中的各种情况:除了0.1、0.2、0.3之外,还有各种两位小数的扣率。因此,Case…End语句又提供了另外一种格式的写法。

第二种语法格式,根据不同的表达式进行判断:
    Case
        When 表达式1 Then 返回值1
        When 表达式2 Then 返回值2
        When 表达式3 Then 返回值3
        ……
    Else 默认返回值
    End
    当“表达式1”成立时,得到“返回值1”;当“表达式2”成立时,得到“返回值2”,其余类推。所有表达式都不成立时,则得到默认返回值。如采用此种写法,就可将上述语句修改为:
    case
        when isnull(折扣,0)=0 then '无折扣'
        when 折扣<=0.1 then '1折以内'
        when 折扣<=0.2 then '2折以内'
        when 折扣<=0.3 then '3折以内'
    else '其它折扣'
    end