首页 新闻 搜索 专区 学院

ISNULL 的使用问题

0
[已关闭问题]

表a
id  name
1 111
2 222
3 333

语句:
select a.id,a.name,b.IsEnabled
from 表a a
left join(select IsEnabled = 1) b on a.id = 1

结果:
id name IsEnabled
1 111 1
2 222 null
3 333 null

语句:
select a.id,a.name,IsEnabled = IsNull(b.IsEnabled,0)
from 表a a
left join(select IsEnabled = 1) b on a.id = 1

结果:
id name IsEnabled
1 111 1
2 222 1
3 333 1

为什么会是这样,在我感觉这两种查询出来的结果应该是一样的呀?请高人指教?

请朋友帮我看了一下,他测试是没有问题的,结果我换了一个数据库执行了一下也是没有问题的,那就是那个数据库的问题,更让不不解了。
不知道各位有没有遇到过这样的问题?

冰碟的主页 冰碟 | 初学一级 | 园豆:112
提问于:2008-12-12 15:27
< >
分享
其他回答(3)
0

没有发现问题,但是两次确实结果不一致,你看一下你执行的实际语句,是不是和你贴出来的不一样?

按第二个结果,你的语句应该是 :
select a.id,a.name,IsEnabled = IsNull(b.IsEnabled,1)
from 表a a
left join(select IsEnabled = 1) b on a.id = 1

也就是 IsNull 的第二个参数应该是1,而不是你上面给出的0

你的第二句,结果应该是:
id name IsEnabled
1 111 1
2 222 0
3 333 0

因为从第一句的结果可以看到 IsEnabled 里有两个null,在第二句话,这两个null被替换成了0,所以应该是这个结果,你上面那个IsEnabled都是1的结果,是你把IsNull的参数写错了吧?

丁学 | 园豆:18530 (专家六级) | 2008-12-12 15:39
0

xuexi

Jared.Nie | 园豆:1940 (小虾三级) | 2008-12-12 16:21
0

刚才研究了一下,我把这两条语句使用SQL查询分析器的显示查询计划分析了一下,发现了不同

第一条不会生成b的零时表,而将on a.id = 2和三是你会发现结果中的第二条和第三条回是1,其它为零

只有on a.id=的列才不为空,其它都为空。

第二条SQL引擎在处理时会生成一个b的零时表,主要是为了isnull函数使用。

生成临时表以后对于访问就会有效,所以isnull函数计算的结果一直为1

 

说白了就是SQL分析时对SQL语句进行的处理方式不同而导致的。

GUO Xingwang | 园豆:3885 (老鸟四级) | 2008-12-12 17:13
0

ISNull第二个参数应该是1

史向平 | 园豆:164 (初学一级) | 2008-12-13 08:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册