where exists (select 1 from 中null=null时遇到的实际问题

数据
--------------------------------(数据A中FLDCPH是没有数据的就是空)
ID   FLDCPH                    STARTTIME
A                              2015-11-06 15:42:52
B        OXA                   2015-11-05 11:26:30
---------------------------------
查询语句
select * from T1 a where  exists (select 1 from T1 where fldcph=fldcph and   TO_CHAR(a.starttime, 'YYYY-MM-DD HH24:MI')>'2015-11-04 13:47:00')


结果
--------------------------------
ID   FLDCPH                    STARTTIME
A                              2015-11-06 15:42:52
B        OXA                   2015-11-05 11:26:30
---------------------------------
查询语句
select * from T1 a where  exists (select 1 from T1 where fldcph=a.fldcph and   TO_CHAR(a.starttime, 'YYYY-MM-DD HH24:MI')>'2015-11-04 13:47:00')


结果
--------------------------------
ID   FLDCPH                    STARTTIME
B        OXA                   2015-11-05 11:26:30
---------------------------------




这个问题在论坛里提问过,大家对每个进行了回一个复,加上在一些标准资料查询查阅后,得到了比较满意的结果
论坛中xiaowengang回复:fldcph=fldcph是一个恒等式。
所以实际select * from T1 a where  exists (select 1 from T1 where fldcph=fldcph and   TO_CHAR(a.starttime, 'YYYY-MM-DD HH24:MI')>'2015-11-04 13:47:00')等价于
select * from T1 a where  exists (select 1 from T1 where    TO_CHAR(a.starttime, 'YYYY-MM-DD HH24:MI')>'2015-11-04 13:47:00')
因此查询中得到了2条数据


实际第二个查询语句我对于别名fldcph=a.fldcph,期初是觉得也是恒等的,但实际上的结果并是这样,在论坛xiaowengang回复中,可以把fldcph=a.fldcph看成两个不同的列的比较,




但是这里之后会引申到一个新的问题当两者为null的时候会出现null=null的比较,这里对论坛回复null=null等于false,我再在网上查阅了一些资料得到了ANSISQL(SQL-92)标准中的描述


即ANSISQL(SQL-92)标准中Null值的比较取值结果都为False,既Null=Null取值也是False
因此数据数据中只有ID为B的数据可行


总结:select * from T1 a where  exists (select 1 from T1 where fldcph=a.fldcph这个局行在网上都能找的到,但是实际上如果我们在查询中需要到null列的数据的fldcph=a.fldcph是不需要的

猜你喜欢

转载自blog.csdn.net/kiranet/article/details/49745061
今日推荐