数据库中如何表示未知的值呢?答案是使用一个特殊的值,我们称之为空值(null)。空值并不是一个空字符串,而是一个特殊的值。空值就表示该列的值未知。当选择一个包含空值的列时,看到的结果是该列中不包含任何内容。在前面从customers表中查询行时,就已经看到了这一点(或者说根本看不到内容):顾客#4的dob列是空值,顾客#5的phone列也是空值。
. e" F; i4 q e* n( x4 A- P在SELECT语句中,也可以使用IS NULL来检查空值。下面的例子就以“dob列为空”可以检索顾客#4的记录:
: i/ L9 c5 n# @. l8 O
7 c' w9 P; N- T5 d! k1 oSELECT customer_id,first_name,last_name,dob
) s# h+ q) A" l8 _" [* E5 l/ n# ^FROM customers9 n5 X# X! ?. U/ G3 {
WHERE dob IS NULL;
1 g7 i6 v! i8 [) Q1 N F
" q( s8 L; W) O5 |
0 E4 s3 A5 D. I$ H$ {4 l8 ?" Y3 @# }
在下面这个例子中,使用的条件是“phone列为空”可以查询出顾客#5的记录:
% m1 N# M7 G& f: U: n2 U
5 P; t( V/ ]1 J* y1 RSELECT customer_id,first_name,last_name,dob
[4 w. ]8 m* g& d, h& y a2 GFROM customers7 n2 ^* |& R2 V1 z! i7 N# x/ Y
WHERE phone IS NULL;
, W; ?8 q: Y2 s7 G
9 ~! I3 F& m. t6 b2 J既然空值不会显示任何内容,那么在检索所有行时又如何区分空值和空字符串呢?答案是使用Oracle内置的一个函数NVL()。NVL()函数可以将空值转换成另外一个可以真正理解的值,NVL()函数可以接受两个参数:列(或者更确切的说是可以返回一个值的任意表达式)和一个值,如果第一个参数是空值,就将其替换成第二个参数的值,下面举例进行说明,NVL()函数将phone列的一个空值转换为字符串“Unknown phone number”
# j8 [& V h' B6 v% t
: {: r a, Z! f& iSELECT customer_id,first_name,last_name,dob
2 |$ t; o6 [3 D' c x. R" uNVL(phone,'Unknown phone number') AS PHONE_NUMBER7 C4 v& B# B/ L& u, E9 S3 T
FROM customers;
0 I: p2 b8 j, \% b2 r0 ?5 u
/ a: Q6 B+ [' k% g4 PNVL()函数除了用于转换包含空值的字符串列之外,还可以用于转换数字列和日期列。
- Q9 k: A" L/ i+ ~2 f, L* ]+ t& c3 d' a6 D: Z) y6 Z& A+ g9 K m! `( I; J
|