首先看看SQL SERVER 联机丛书的信息,其中我们该注意的地方我用红字标出:
ISNULL
使用指定的替换值替换
NULL
。
语法
ISNULL ( check_expression , replacement_value )
参数
check_expression
将被检查是否为
NULL
的表达式。
check_expression
可以是任何类型的。
replacement_value
在
check_expression
为
NULL
时将返回的表达式。
replacement_value
必须与
check_expresssion
具有相同的类型。
返回类型
返回与
check_expression
相同的类型
。
注释
如果
check_expression
不为
NULL
,那么返回该表达式的值;否则返回
replacement_value
。
NULLIF
如果两个指定的表达式相等,则返回空值。
语法
NULLIF ( expression , expression )
参数
expression
常量、列名、函数、子查询或算术运算符、按位运算符以及字符串运算符的任意组合。
返回类型
返回类型与第一个
expression
相同
。
如果两个表达式不相等,
NULLIF
返回第一个
expression
的值。如果相等,
NULLIF
返回第一个
expression
类型的空值
。
注释
如果两个表达式相等且结果表达式为 NULL , NULLIF 等价于 CASE 的搜索函数 。
从以上的红字信息我们可以发现:
1、两个函数的返回值都是
特定类型的,就算是空值,也是特定类型的,也就是说是特定的
数据类型和
长度(特别是字符串类型的长度)的。
2、使用两个函数的组合可以让SQL代码精简并可
替代Case语句
下面给出一些示例供大家参考,请大家在使用中注意:
SELECT HopeBe_0 = ISNULL(NULLIF('',''),0)
--
返回
*
--
说明:显然这里已经违反了
ISNULL
的
要求了(红字部分),
--
且
0
转成字符串的长度为
1
,而
''
的长度为
0
SELECT HopeBe_0 = ISNULL(NULLIF(' ',' '),0)
--
返回
0
--
说明:这里虽然已经违反了
ISNULL
的
要求了(红字部分),
--
但是
0
转成字符串的长度为
1
,而
' '
的长度为也为
1
SELECT HopeBe_Empty = ISNULL(ISNULL('',''),0)
--
返回
''
--
说明:这个可以理解吧
SELECT HopeBe_n_0 = ISNULL(NULLIF('',''),'0000')
--
返回
''
--
说明:这个比较经典,请往下看
SELECT HopeBe_n_0 = ISNULL(NULLIF('x','x'),'0000')
--
返回
0
SELECT HopeBe_n_0 = ISNULL(NULLIF('xx','xx'),'0000')
--
返回
00
SELECT HopeBe_n_0 = ISNULL(NULLIF('xxx','xxx'),'0000')
--
返回
000
SELECT HopeBe_n_0 = ISNULL(NULLIF('xxxx','xxxx'),'0000')
--
返回
0000
SELECT HopeBe_n_0 = ISNULL(NULLIF('xxxxx','xxxxx'),'0000')
--
返回
0000
至于替代 case 的示例靠大家领会,我只给了我经常用的小片:
... IsNull(NullIf(count(ID),0),1)
--说明:这是为了防止除0和除NULL