Chinaunix首页 | 论坛 | 博客
  • 博客访问: 575726
  • 博文数量: 226
  • 博客积分: 10080
  • 博客等级: 上将
  • 技术积分: 1725
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-26 11:15
文章分类

全部博文(226)

文章存档

2011年(5)

2010年(64)

2009年(99)

2008年(37)

2007年(21)

我的朋友

分类: 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;
y    := 
NULL;
...
IF x != y THEN   -- yields NULL, not TRUE
  sequence_of_statements; 
-- not executed
END IF;

同样,下例中的sequence_of_statements也不会被执行:

a    := NULL;
b    := 
NULL;
...
IF a = b THEN   -- yields NULL, not TRUE
  sequence_of_statements; 
-- not executed
END IF;

·    NOT操作符

让我们再回忆一下逻辑操作符NOT,当对一个NULL值应用NOT时,结果总是NULL。因此,下面两段内容并不相同。

IF x > y THEN
  high    := x;
ELSE
  high    := y;
END IF;

IF NOT x > y THEN
  high    := y;
ELSE
  high    := x;
END IF;

当IF条件值为FALSE或NULL时,ELSE部分就会被执行。如果x和y都不为NULL的话,两段程序运行的效果是一样的。但是,如果IF条件为NULL的话,第一段是给y赋值,而第二段是给x赋值。

·    零长度字符串

PL/SQL把零长度字符串当作空值处理,这其中包括由字符函数和布尔表达式返回的值。下面的语句均是给目标变量赋空值的操作:

null_string    := TO_CHAR('');
zip_code       := SUBSTR(address, 25, 0);
valid          :=(NAME != '');

所以,对于检测空字符串,要使用IS NULL操作符:

IF my_string IS NULL THEN ...

·    连接操作符

连接操作符会忽略空值,例如表达式

'apple' || NULL || NULL || 'sauce'

会返回

'applesauce'

·    函数

如果给内置函数传递空值,一般也都会返回空值,但以下几种情况除外。

函数DECODE将它的第一个参数和后面的一个或多个表达式相比较(表达式的值有可能为空),如果比较的内容相匹配,就会返回后面的结果表达式。例如在下面的例子中,如果字段rating的值为空,DECODE就会返回1000:

SELECT DECODE(rating,
             
 NULL, 1000,
              
'C', 2000,
              
'B', 4000,
              
'A', 5000
             )
  
INTO credit_limit
  
FROM accts
 
WHERE acctno = my_acctno;

函数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';
  NA
ME                := REPLACE(syllabified_name,
                                 
' - ',
                                 
NULL
                                );

运算的结果字符串是"goldilocks"。如果第二个和第三个参数都是NULL值,REPLACE就直接返回第一个参数。 

阅读(1108) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~