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中测试结果相同。
浙公网安备 33010602011771号