分类: Oracle
2010-01-17 15:46:52
在使用NULL值时,我们一定要记住下面几条规则,避免发生一些常见的错误:
1. 比较中如果有空值的话,那么计算结果总为NULL
2. 对空值应用逻辑操作符NOT,结果还是NULL
3. 条件控制语句中,如果条件的运算结果值为NULL的话,与之相关的语句就不会被执行
4. 简单CASE语句中对于空值的判断要使用WHEN expression IS NULL
下例中,我们期待的是sequence_of_statements被执行,因为x和y看起来就是不等的。但是,由于NULL是不确定的值,那么,x是否等于y也就无法确定了。所以,sequence_of_statements并不会执行。
x := 5; |
同样,下例中的sequence_of_statements也不会被执行:
a := NULL; |
· NOT操作符
让我们再回忆一下逻辑操作符NOT,当对一个NULL值应用NOT时,结果总是NULL。因此,下面两段内容并不相同。
IF x > y THEN |
IF NOT x > y THEN |
当IF条件值为FALSE或NULL时,ELSE部分就会被执行。如果x和y都不为NULL的话,两段程序运行的效果是一样的。但是,如果IF条件为NULL的话,第一段是给y赋值,而第二段是给x赋值。
· 零长度字符串
PL/SQL把零长度字符串当作空值处理,这其中包括由字符函数和布尔表达式返回的值。下面的语句均是给目标变量赋空值的操作:
null_string := TO_CHAR(''); |
所以,对于检测空字符串,要使用IS NULL操作符:
IF my_string IS NULL THEN ... |
· 连接操作符
连接操作符会忽略空值,例如表达式
'apple' || NULL || NULL || 'sauce' |
会返回
'applesauce' |
· 函数
如果给内置函数传递空值,一般也都会返回空值,但以下几种情况除外。
函数DECODE将它的第一个参数和后面的一个或多个表达式相比较(表达式的值有可能为空),如果比较的内容相匹配,就会返回后面的结果表达式。例如在下面的例子中,如果字段rating的值为空,DECODE就会返回1000:
SELECT DECODE(rating, |
函数NVL在判断出第一个参数是空的情况下,会返回第二个参数的值,否则直接返回第一个参数的值。使用方法如下:
start_date := NVL(hire_date, SYSDATE); |
函数REPLACE第二个参数是NULL的时候,它就会返回第一个参数的值,不管是否有第三个参数。例如,在下面例子中,结果字符串new_string的值和old_string的值完全一样。
new_string := REPLACE(old_string, NULL, my_string); |
如果第三个参数为空的话,REPLACE就会把第一个参数中出现的第二个参数删除,然后返回结果。如下面这个例子:
syllabified_name := 'gold - i - locks'; |
运算的结果字符串是"goldilocks"。如果第二个和第三个参数都是NULL值,REPLACE就直接返回第一个参数。