GROUP BY 在聚集函数中遇到Null值的小问题解析

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在聚集函数中碰到空值问题的小剖析。

你可能感兴趣的:(oracle-11g,数据库运用)