步行者

--勿在浮沙筑高台
posts - 14, comments - 0, trackbacks - 0, articles - 1
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

应注意的2个SQL陷阱

Posted on 2008-11-24 12:35 Niels 阅读(51) 评论(0) 编辑 收藏
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中测试结果相同。