1. NULL连接任意字符串, 结果是NULL
有如下的数据
F1 | F2 |
a | a |
b | NULL |
(表1)
执行下面的查询:
select F1, concat(F2,'str') from t
我们可能想当然地以为结果应该是
F1 | F2 |
a | astr |
b | str |
(表2)
但事实上,结果是:
F1 | F2 |
a | astr |
b | NULL |
(表3)
即NULL连接任意字符串,结果都是NULL
如果期望是表2的结果,SQL语句应该如下:
select F1, concat(IfNULL(F2, ''), 'str') from t
MySql中的IfNULL函数相当于SQL Server中IsNull,Oracle中的Nvl。
2. 字段为NULL, 则这个字段和其它字段比较, 既不"等于",也不"不等于"
原数据如下:
F1 | F2 |
A | NULL |
NULL | B |
NULL | NULL |
C | C |
D | DD |
(表4)
查找F1=F2的记录:
select * from t where F1 = F2
结果如下:
F1 | F2 |
C | C |
(表5)
第3行的两个NULL并不被认为是相等。
查找F1 <> F2的记录:
select * from t where F1 <> F2
结果如下:
F1 | F2 |
D | DD |
(表6)
可见,凡是有NULL参加比较的列,既不"相等",也不"不相等"
因此,"相等"的行数加上"不相等"的行数也就不一定等于总行数
以上结论在MySql 5.0和SQL Server 2000中测试结果相同。