T-SQL中ISNULL() VS COALESCE()定义

上一篇 / 下一篇  2011-04-29 23:20:23 / 个人分类:DataBase

在处理Sql Server中的一些值或表的列时碰到NULL值时,开发者们必须进行判断并返回另一个值,这时得用到两个函数:IsNull() 和 Coalesce()

1、  ISNULL()

IsNull 是SQL SERVER内置的TSQL函数,但不是ANSI-92定义的,是MS扩展ANSI-92自行定义的一个新方法。
IsNull()有两个参数,第一个是将被检查是否为 NULL 的表达式,如果这个表达式的值是NULL那么第二个表达式(不管是不是NULL)就会返回。请看如下示例:

SELECT ISNULL(NULL, 1)
--Returns 1

SELECT ISNULL(NULL, NULL)
--Returns NULL

2、COALESCE()
COALESCE() 像ISNULL一样是SQLSERVER内置的一个函数,不像ISNULL的是,Coalesce是ANSI-92标准的一部分,这个函数返回表达式列表的第一个非NULL的表达式,表达式列表可是多两个或更多,并且表达式的值可以是不同类型的。请看如下示例:


SELECT COALESCE(NULL, 1)
--Returns 1

SELECT COALESCE(NULL, 3, NULL, 1)
--Returns 3

3、ISNULL vs. COALESCE
当有一个问题有多种方法解决时必然存在一个选择的问题,不可回避的就是:哪个更优?比较这两个函数的差异会发现Coalesce通常优于IsNULL:
- COALESCE 是ANSI-92标准定义. 当把你的应用移植于其它RDBMS时COALESCE不需要修改。
- COALESCE 能接受多2个表达式,ISNULL却只能接受两个,为了能比较多于两个表达式ISNULL必须采用如下形式:

SELECT ISNULL(ISNULL(Col1, Col2), Col3)

-ISNULL 强制结果的数据类型为第一个参数的类型。看如下例子当使用ISNULL时会得到一个我们意外的结果,但是用Coalesce却可得到期望的结果。

DECLARE @Field1 char(3), @Field2 char(50)
SET @Field2 = 'Some Long String'
SELECT ISNULL(@Field1, @Field2)
--Returns 'Som'

SELECT COALESCE(@Field1, @Field2)
--Returns 'Some Long String'

注:在一些情况下,COALESCE将产生一些意外结果。 COALESCE by nature promotes it's arguments to the highest datatype among compatable arguments (arguments which are not explicitly case, and which aren't compatable, will of course throw an error). COALESCE会把所有表达式向一个公共的能包容所类型的数据类型转换(因为是隐式的转换情况,有些类型是不兼容,当然会抛出一个错误)。 When using COALESCE on an integer and a datetime, in that order, COALESCE will cast the integer as a datetime.当COALESCE的参数是一个整数和一个日期时间时,只能COALESCE隐式的把整数转换为一个日期时间。 For example:例如:

SELECT COALESCE SELECT COALESCE(5, GETDATE()) Se( 5 , GETDATE ( ) )
     Will not return 5, it will return 1900-01-06 00:00:00.000 (5 as a datetime).

不会返回5 ,它返回1900-1-6 00:00:00.000 ( 5作为一个日期时间) 。
 
4、性能
多数情况下,这两个函数的执行是差不多的,一般情况下多数的人认为ISNULL是稍优于Coalesce的,虽然我们没有一个充分的理由来证明这些,但是当性能成为一个不能不考虑的问题时,我们可以用测试数据进行测试这两种办法的性能。
疑点:
事实上我做过74W行的数据测试,性能上基本没有什么差别,并且对两个表达式的判断ISNULL略显优势.
其实
COALESCE(EXPRESSION1,…N) 等价于:
CASE
WHEN (EXPRESSION1 IS NOT NULL) THEN EXPRESSION1
……
ELSE Null
END

但是ISNULL的执行过程是如何工作的呢,难道是IF … else …  ??

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/happyflystone/archive/2009/04/22/4099117.aspx


TAG:

 

评分:0

我来说两句

Open Toolbar