NULLIF()函数
主流数据库都支持NULLIF()函数,这个函数的参数格式如下:
NULLIF ( expression1 , expression2 )
如果两个表达式不等价,则 NULLIF 返回第一个 expression1的值。如果两个表达式等
价,则 NULLIF 返回第一个 expression1类型的空值。也就是返回类型与第一个 expression
相同。
下面的SQL演示了NULLIF()函数的用法:
SELECT FBirthDay,FRegDay,
NULLIF(FBirthDay,FRegDay)
FROM T_Person
执行完毕我们就能在输出结果中看到下面的执行结果:
FBirthDay FRegDay 1981-03-22 00:00:00.0 1998-05-01 00:00:00.0 1981-03-22 00:00:00.0
1987-01-18 00:00:00.0 1999-08-21 00:00:00.0 1987-01-18 00:00:00.0
1987-11-08 00:00:00.0 2001-09-18 00:00:00.0 1987-11-08 00:00:00.0
1982-07-12 00:00:00.0 2000-03-01 00:00:00.0 1982-07-12 00:00:00.0
1983-02-16 00:00:00.0 1998-05-01 00:00:00.0 1983-02-16 00:00:00.0
<NULL> 1999-03-01 00:00:00.0 <NULL>
<NULL> <NULL> <NULL>
1972-07-18 00:00:00.0 1995-06-19 00:00:00.0 1972-07-18 00:00:00.0
CASE函数
COALESCE()函数只能用来进行空值的逻辑判断处理,如果要实现“如果年龄大于25
则返回姓名,否则返回别名”这样的逻辑判断就比较麻烦了。在主流数据库系统中提供了
CASE函数的支持,严格意义上来讲CASE函数已经是流程控制语句了,不是简单意义上的
函数,不过为了方便,很多人都将CASE称作“流程控制函数”。
CASE函数有两种用法,下面分别介绍。
用法一
CASE函数的语法如下:
CASE expression
WHEN value1 THEN returnvalue1
WHEN value2 THEN returnvalue2
WHEN value3 THEN returnvalue3
……
ELSE defaultreturnvalue
END
CASE函数对表达式expression进行测试,如果expression等于value1则返回returnvalue1,
如果expression等于value2则返回returnvalue2,expression等于value3则返回returnvalue3,……
以此类推,如果不符合所有的WHEN条件,则返回默认值defaultreturnvalue。
可见CASE函数和普通编程语言中的SWITCH……CASE语句非常类似。使用CASE函数
我们可以实现非常复杂的业务逻辑。下面的SQL用于判断谁是“好孩子”,我们比较偏爱Tom
和Lily,所以我们将他们认为是好孩子,而我们比较不喜欢Sam和Kerry,所以认为他们是坏
孩子,其他孩子则为普通孩子:
SELECT
FName,
(CASE FName
WHEN 'Tom' THEN 'GoodBoy'
WHEN 'Lily' THEN 'GoodGirl'
WHEN 'Sam' THEN 'BadBoy'
WHEN 'Kerry' THEN 'BadGirl'
ELSE 'Normal'
END) as isgood
FROM T_Person
执行完毕我们就能在输出结果中看到下面的执行结果:
FNAME ISGOOD
Tom GoodBoy
Jim Normal
Lily GoodGirl
Kelly Normal
Sam BadBoy
Kerry BadGirl
Smith Normal
BillGates Normal
CASE函数在制作报表的时候非常有用。比如表T_Customer中的FLevel字段是整数类型,
它记录了客户的级别,如果为1则是VIP客户,如果为2则是高级客户,如果为3则是普通客
户,在制作报表的时候显然不应该把1、2、3这样的数字显示到报表中,而应该显示相应的
文字,这里就可以使用CASE函数进行处理,SQL语句如下:
SELECT
FName,
(CASE FLevel
WHEN 1 THEN 'VIP客户'
WHEN 2 THEN '高级客户'
WHEN 3 THEN '普通客户'
ELSE '客户类型错误'
END) as FLevelName
FROM T_Customer
用法二
上边一节中介绍的CASE语句的用法只能用来实现简单的“等于”逻辑的判断,要实现
“如果年龄小于18则返回‘未成年人’,否则返回‘成年人’”是无法完成的。值得庆幸的是,
CASE函数还提供了第二种用法,其语法如下:
CASE
WHEN condition1 THEN returnvalue1
WHEN condition 2 THEN returnvalue2
WHEN condition 3 THEN returnvalue3
……
ELSE defaultreturnvalue
END
其中的condition1 、condition 2、condition 3……为条件表达式,CASE函数对各个表达
式从前向后进行测试,如果条件condition1为真则返回returnvalue1,否则如果条件condition2
为真则返回returnvalue2,否则如果条件condition3为真则返回returnvalue3,……以此类推,
如果不符合所有的WHEN条件,则返回默认值defaultreturnvalue。
这种用法中没有限制只能对一个表达式进行判断,因此使用起来更加灵活。比如下面的
SQL语句用来判断一个人的体重是否正常,如果体重小于40则认为太瘦,而如果体重大于50
则认为太胖,介于40和50之间则认为是正常:
SELECT
FName,
FWeight,
(CASE
WHEN FWeight<40 THEN 'thin'
WHEN FWeight>50 THEN 'fat'
ELSE 'ok'
END) as isnormal
FROM T_Person
执行完毕我们就能在输出结果中看到下面的执行结果:
FNAME FWEIGHT ISNORMAL
Tom 56.67 fat
Jim 36.17 thin
Lily 40.33 ok
Kelly 46.23 ok
Sam 48.68 ok
Kerry 66.67 fat
Smith 51.28 fat
BillGates 60.32 fat