NULLIF()函数,CASE函数

来源:互联网 发布:js 进度条的实现原理 编辑:程序博客网 时间:2024/05/16 00:47
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
0 0