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

来源:互联网 发布:淘宝曲度腰椎治疗仪 编辑:程序博客网 时间:2024/05/21 07:11

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)---------- ----------     0SQL> 

发现返回了一行数据,但是sum(sal)列为空,没有数据。
那么如果对它进入group by 呢?

SQL> select count(*),sum(sal) from emp_2 where deptno=40 group by deptno;no rows selectedSQL> 

提示说:未选定的行,可以说明,当在错误的位置加入了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 foundORA-06512: at line 4SQL> 

发现在执行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 foundPL/SQL procedure successfully completed.SQL> 

上面定义了一个SQL异常代码输出变量,所以通过引起的异常我们就能直到到底是哪儿出问题了。
以上就是对于这个group by在聚集函数中碰到空值问题的小剖析。

原创粉丝点击