Firebird对于NULL的处理有很多需要注意的地方:
1,定义表中的列是否可以为Null,语法是:create table MyTable ( i int not null )
2,判断值是否为Null,用"is"关键字,例如 a is null/ a is not null
3,对值赋予Null,用"="关键字,例如Update tablename set a = null where .....
4,[A] is/is not distinct from [B],
例如if ( A is distinct from B ) then...,
需要注意下,distinct返回true的条件是A和B有不同的值,或一个为NULL,一个有值
not distinct返回true的条件是A和B的值相同,或者都为空
5,Null在运算中的用法
在数字和字符串的运算中出现NULL的时候,它们的结果都会返回NULL,例如
1 + 2 + 3 + NULL //null
'Home ' || 'sweet ' || NULL //null
MyField = NULL //null
6,Boolean运算符
not NULL = NULL
NULL or false = NULL
NULL or true = true
NULL or NULL = NULL
NULL and false = false
NULL and true = NULL
NULL and NULL = NULL
7,在IN表达式中的NULL
A IN ( Expr1, Expr2, ..., ExprN ) ,相当与A=Expr1 or A=Expr2 or ... or A=ExprN,所以如果A为NULL,返回的结果一定都为NULL,但是在(Expr1,...)这个列表中如果有值为NULL的时候,则如果列表中存在A的值,那么“A IN( Expr1, Expr2, ..., ExprN )” returns true
“A NOT IN( Expr1, Expr2, ..., ExprN )” returns false
如果列表中不存在A的值
“A IN( Expr1, Expr2, ..., ExprN )” returns NULL
“A NOT IN( Expr1, Expr2, ..., ExprN )” returns NULL
8,在Exists和SINGULAR(是否只有一条记录)表达式中的NULL
Exists和SINGULAR的结果只返回true或false
9,当ORDER BY中的列有NULL的时候,NULL被当作是最小的值来处理,如果是asc,就排列在最前面,如果是desc,就排列在最后面
10,当在sum,count,MAX, MIN,AVG这些内在函数的时候都会忽略为NULL的行,特别要注意的是Count,count(*)和count(columnname)返回的结果是不一样的.count(columnname)会忽略掉为NULL的行
11,在约束条件check设置的时候,例如check (a > 1);这里对NULL是不进行检测的,如果要去掉NULL,就要加上a is not null.
12,SELECT DISTINCT中的NULL,会被当作相等的值来处理,例如SELECT DISTINCT name from dt,如果name有两行为NULL,那么这里就只能获取一行。
13,nullif(express),例如nullif(name, 'a'),当name='a'的时候,它就转换为Null.