Null值属于任何类型,它和空字符不一样,空字符它是属于varchar2的数据类型,但是null可以是任何数据类型,因此在处理空值的时候特别要小心。
示例:在oracle中的模版示例中有emp表,我们知道有一列deptno列,但是其中没有任何一个员工,因此对它进行group by 的时候,如果不加group by 的时候, 它会返回一行数据,但是如果加了结果就不是预想的那样了。
来做一个演示:
统计deptno为40的合计工资和数量
SQL> select count(*),sum(sal) from emp_2 where deptno=40;
COUNT(*) SUM(SAL)
---------- ----------
0
SQL>
发现返回了一行数据,但是sum(sal)列为空,没有数据。
那么如果对它进入group by 呢?
SQL> select count(*),sum(sal) from emp_2 where deptno=40 group by deptno;
no rows selected
SQL>
提示说:未选定的行,可以说明,当在错误的位置加入了group by语句,那么Oracle将会报错。
我们可以使用PL/SQL进行处理一下:
首先没有加group by的时候:
SQL> declare
2 v_sal emp_2.sal%type;
3 begin
4 select sum(sal) into v_sal from emp_2 where deptno=40;
5 dbms_output.put_line('v_sal = '||v_sal);
6 end;
7 /
v_sal =
PL/SQL procedure successfully completed.
可以看到,它是有返回值的,但是这个值为空。
现在尝试加入group by 来验证一下:
SQL> declare
2 v_sal emp_2.sal%type;
3 begin
4 select sum(sal) into v_sal from emp_2 where deptno=40 group by deptno;
5 dbms_output.put_line('v_sal = '||v_sal);
6 end;
7 /
declare
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 4
SQL>
发现在执行PL/SQL块时,Oracle报错,所以null的处理一定要注意,在写PL/SQL程序的时候一定要加入异常。
因为时不可预知的。
所以这样处理就能正常显示:
SQL> declare
2 v_sal emp_2.sal%type;
3 v_sqlcode number(10);
4 v_sqlerr varchar2(50);
5 begin
6 select sum(sal) into v_sal from emp_2 where deptno=40 group by deptno;
7 dbms_output.put_line('v_sal = '||v_sal);
8 exception
9 when NO_DATA_FOUND then
10 v_sqlcode := SQLCODE;
11 v_sqlerr := SQLERRM;
12 dbms_output.put_line('SQLCODE >> ORA-'||v_sqlcode||chr(13)||'SQLERR >> '||v_sqlerr);
13 end;
14 /
SQLERR >> ORA-01403: no data found
PL/SQL procedure successfully completed.
SQL>
上面定义了一个SQL异常代码输出变量,所以通过引起的异常我们就能直到到底是哪儿出问题了。
以上就是对于这个group by在聚集函数中碰到空值问题的小剖析。