今天无意看到nullif()这个函数,猛的想起isnull 这个函数,这两个意思一样吗。我知道 isnull(check_expression,replacement_expression)
如果check_expression的值为null,用replacement_expression的值代替。查了一下 nullif(expression1,expression2) 如果两个
表达式的值一样就返回空值,注意不是null值。如果expression1和expression2的值不一样,返回expression1的值
然后试了几个语句,发现有问题:
select A=isnull(nullif('',''),1)
这个返回的是1,这个好理解nullif('','')因为这两个值相等,所以返回的是空值,空值并不是null ,这样的话结果应该是空值,怎么会是1呢。
s elect A =isnull(isnull('',''),0)
这个返回的是空值,isnull('','')返回空值,所以最后返回的是空值。
select A=isnull(nullif('',''),112)
这个返回的是*.
select A=isnull(nullif('',''),'K112')
这个返回K.只能这样解释nullif('','')这个返回的是长度为1的null,但是nullif('','')这个不会返回null的,根据定义是返回空值的。难道是sql 内部处理了。如果是空值的话,就转换成
SELECT A = ISNULL(NULLIF('*','*'),'1234')
这个返回1
SELECT A = ISNULL(NULLIF('xxx','xxx'),'1234')
这个返回123,这个理解是nullif('xxx','xxx') 返回的是第一个表达式的类型的空值,因为这个类型长度是3,所以返回的特殊类型的长度是3
,这个特殊类型是null值吗,只能这样解释,如果不是长度为3的null的话,应该返回的是长度为3的空值。
总结一下,不明白的地方:
isnull(nullif('',''),1): nullif('','')返回的是特殊字符的带有指定长度的字符,不知道是什么类型的.isnull(nullif的返回类型,1) 结果是1.正好说明nullif返回的是长度是1的特殊字符,但是这个字符isnull有不能识别,好像是特殊字符类型的null.
isnull(nullif('',''),12) : 返回* .说明特殊字符类型的null 的长度.和12 的长度不匹配, 不能把12转换成特殊字符的类型.也有的说.字符类型和数字在内存中的存储方式不 一样.
isnull(nullif('',''),'mnsps'): 返回的是m .说明这个特殊的字符类型的null的长度是以1.所以 'mnsps' 只取m
isnull(nullif('***','***'),'123') : 返回123 :说明这个特殊字符类型的null长度是根据nullif第一个表达式的长度来定的.