|
原帖由 Kenniu 于 2009-10-9 08:15 发表 ![]()
以下一点小经验,希望对你们有所帮助。
在做项目的时候,有修改到的procedure中写了类似这样一句
SELECT COUNT (b.PLANRMK) INTO varplantmkcount FROM smtbcrud b WHERE ...
If varplantmkcount > 0
SELECT b.PLANRMK into varplantmk FROM smtbcrud b WHERE ...
If varplantmk is null
...
End If;
End If;
本意是想如果smtbcrud里面如果找到了匹配的行的话才继续做If里面的东西,而我的If里面做的是判断如果PLANRMK为空的话则update为***.
用意很简单,但是却出现了问题,PLANRMK 为空的话update不了。
大家可以试一下,如果TableA的栏位a的值全部为Null的话,大家用这句Sql试一下:
select count(a) from TableA
结果是多少?TableA的行数(我以前是这样认为的)?错了,结果为0.
原来Count会忽略null的行。
可以再试一个例子,还是TableA的栏位a, 除了一行是有值之外,其他行都是为Null,再用这句Sql:
select count(a) from TableA
想必大家都知道结果了,结果为1,Null的行被忽略掉了。
怎么解决?用select(PK),select count(*),select count(1)或者select(not null column)代替就好了。
当然这些方式在效率上会有一点点差异,但如果不是数据量很大的话,基本上我们可以忽略。如果有可能数据量很大的话,我的愚见是select(PK)>select count(*)>select count(1)>select(not null column), 大家可以上网找一些资料,或者自己做一些测试。
当然你硬要用这个栏位的话,又想不忽略null行的话,你可以试一下
select count(nvl(a,0)) from TableA
count(pk),count(*),count(1)这几个在执行计划一样的情况下,并没有什么区别,至少在现在的版本里,可能历史版本有些区别
如果存在pk,count(*),count(1)一般也会选择index fast full scan(pk index) |
|