以文本方式查看主题

-  课外天地 李树青  (http://njcie.com/bbs/index.asp)
--  清心茶舍  (http://njcie.com/bbs/list.asp?boardid=21)
----  老师可以解释一下下面的话吗?  (http://njcie.com/bbs/dispbbs.asp?boardid=21&id=233)

--  作者:信管04a43
--  发布时间:2006/11/11 21:12:25
--  老师可以解释一下下面的话吗?

ansi/iso标准定义了在between测试中处理null值得一些复杂的规则

1 如果测试表达式生成一个null值,或者如果定义范围的两个表达式生成了null值,那么between测试返回一个null值。

2 如果定义范围下限的表达式生成一个null值,那么如果测试值比上限大,between测试则返回false。否则,返回null

3 如果定义范围上限的表达式生成一个null值,那么如果测试值比下限小,between测试返回false。否则,返回null

老师可以举个实例吗? 看的都晕了。。。。。。

图片点击可在新窗口打开查看图片点击可在新窗口打开查看图片点击可在新窗口打开查看图片点击可在新窗口打开查看图片点击可在新窗口打开查看图片点击可在新窗口打开查看图片点击可在新窗口打开查看
--  作者:admin
--  发布时间:2006/11/12 20:31:41
--  回复

空值的比较是比较古怪的!比如在between语句中,不过也是符合逻辑的。

如有学生表:
000001 黎明 1 1976-11-23 00:00:00 NULL
000002 赵怡春 0 1979-12-31 00:00:00 1.78
000003 张富平 1 1975-05-20 00:00:00 1.8099999
000004 白丽 0 1976-01-30 00:00:00 1.76
000005 牛玉德 1 1979-03-17 00:00:00 1.74
000006 姚华 0 1972-10-01 00:00:00 1.75
000007 李*南 1 1977-10-01 00:00:00 1.76

有如下查询:
查询身高介于所有学号比他小的学生最小身高和1.76之间的学生信息:
select * from stu as a where height between  (select min(height) from stu as b where number<a.number) and 1.76

显示为:
000006 姚华 0 1972-10-01 00:00:00 1.75
000007 李*南 1 1977-10-01 00:00:00 1.76

说明:
000002号学生没有命中,原因在于学号比其小的学生身高为null,而他的身高为1.78,此时的1.78大于between语句的上限1.76,所以此记录不满足条件。

如果将000002号学生身高设为1.74,仍然没有显示,原因在于学号比其小的学生身高为null,而他的身高为1.74,小于between语句的上限1.76,比较结果返回null,而空值是作为假来处理的。这就是“如果定义范围下限的表达式生成一个null值,那么如果测试值比上限大,between测试则返回false。否则,返回null”。

[此贴子已经被作者于2010-12-13 19:48:11编辑过]