`
wwwlyxwww
  • 浏览: 34896 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

oracle sum为null时做法

阅读更多

当没记录时赋为0

 

select nvl(sum(area),0)area

 

 

 

以下部分为转载

 

 

本文发表于《软件报》2009年29期2009-07-20 第17版 属于本期推荐的文章之一

文章的难度不高,但是很有“科普”意义,有助于大家对NULL的认识。

 

在数据库中,空值用来表示实际值未知或无意义的情况。在数据结果中如果某行某列没有值,那么就称它为空值(NULL)。任何数据类型的列,如果没有使用非空(NOT NULL)或主键(PRIMARY KEY来进行完整性限制,都可以用空值,没有正确理解它的意义,忽视它存在的重要性,那它之间发生的争似乎就有点像唐·吉诃德”一样了。



一、我们要理解NULL存在的意义


它和数据中的0值、字符串的空串所代表的意义是不一样的,它和任何数据之间的比较没有意义。
在条件中引用到空值通常都使用 is Null或者is not null的方式来处理。
在一个允许使用空值的列,插入时没有明确指定数据值时,插入的就是空值。由于它的特殊意义,在实际使用时就尽量不要使用产生歧义表达式,如:
with t as(
select 10 id,null dat from dual
union all
select 20, 10 from dual )
select * from t  where dat in (10, null);
也许想查询出来dat值为10或者是Null的数据,其目的是枉然的,所以对于使用NULL时不要依赖于自己的想象,对于它需要写成这样:
Select * from t where dat in ( 10 ) or dat is
null;
由于NULL的存在,如果使用is null之类的条件通常索引也是不能起作用的。因而NULL的它显式地使用有助于别人的理解



二、Oracle中处理NULL的函数


既然我们知道NULL值在处理中容易造成误解,在实际统计与查询分析中,使用相应函数来进行数据处理,一方面保证结果的正确性,也让程序的可读性加强。对NULL最好的武器有:Nvl、nvl2、Nullif,当然在某些情况下用decode也能很好地解决问题。下面来看看各路神仙处理NULL值时的特质吧。

NVL
用于对空值时返回指定值,否则返回原值。例如想把空值返回成当前系统时间:
Select nvl(xiugaisj, sysdate ) from t;
对于数据:
with tlist as (
select 10 as rin, NULL as rout from dual
union all
select NULL, 5  from dual
union all
select 7, 7 from dual
union all
select null, null from dual
union all
select 3, 5 from dual )
我们可以使用:
select sum( nvl(rin,0) - nvl(rout,0)) from tlist;
但由于sum函数具有忽略NULL值的计算功能,因此达成上述目标使用以下的SQL也是一样:
select sum(rin) - sum(rout) from tlist;

NVL2
用于对空值返回指定值,非空值返回另外一个值,它比较适用于那些统计空值数据个数时的用法,如果使用nvl2(rin,rin,0)那就是和nvl(rin,0)是一样的效果了。对于上述数据我们希望统计数据有效值的个数,就需要这样使用了:
Select sum(nvl2(rin,1,0)), sum(nvl2(rout,1,0)) from tlist;

NULLIF
其实用于比较两个数据之间的关系,如果相等则返回NULL,否则返回前一个值。比如:
Select nullif(rin, rout), rin, rout from tlist;
我们已经提及,与NULL之间的数据比较是没有意义的,所以上述情况的返回值还是挺有意思的:


 


从规则中都可以理解上述的数据值,1和5是数据不等,返回前面的值,3是相等返回空值,第2和4条由于自身值是NULL,所以无论如何返回都是空值。所以如果只是要达到这个效果,使用decode(rin,rout,null,rin)是一样的。但是NULLIF有一个特性,就是RIN不能是直接使用NULL,如果使用“Nullif(null,rin)”就会报相应的ORACLE错误,而使用:Decode(null,rout,null,rin)却是没有问题的。

在上面我们提及了处理NULL的函数,其实从10g开始,ORACLE还提供了很有意义的用于条件处理特殊的NULL相关函数,下面有请lnnvl上场:

LNNVL( condition )
的作用

Condition的结果


返回值


TRUE


FALSE


FALSE


TRUE


UNKNOWN


TRUE


    还是以实例来讲话比较好,对于结果:
with tlist as(
select 1000 id, 20 gty, NULL ilevel from dual union all
select 2000,15,8 from dual union all
select 2000,null,8 from dual union all
select 3000,8,10 from dual union all
select 4000,12,6 from dual union all
select 5000,2,2 from dual union all
select 6000,4,5 from dual)
select * from tlist where gty<ilevel;


在这样的情况下,如果gty或者是ilevel是空值的情况下,都不会满足条件,有时候我们可能希望这样的情况下,空值也都能够反应出来,那么只要这样就搞定:
Select * from tlist where lnnvl(gty>=ilevel);
在这里以下的语句和它等效:
Select * from tlist where gty<ilevel or gty is NULL or ilevel is null;
但有时候我们的后续的条件可能要复杂一些时,那么利用lnnvl就可显威力了。



三、NULL的排序


除了数据处理,其实在数据的返回时,NULL值的顺序也有很重要。我们关注数据的时候更多一些,所以无论是正向排序还是反向排序时,都希望把此列NULL值的数据排在最后,所以就要使用NULLS FIRST或者是NULLS LAST来处理,象空值在ORACLE的默认情况下都是当无穷大来处理的,所以我们希望按ilevel进行降序排列时,NULL值的数据排到后面就可以这样写:
Select * from tlist order
by ilevel desc
nulls
last;
当然有兴趣的话也可以看看nulls first的作用了。
分享到:
评论

相关推荐

    oracle中对null值的处理

    当一个或多个参数为NULL时,`CONCAT` 函数会返回NULL。如果想忽略NULL值,可以使用 `COALESCE` 或 `NVL` 函数。 5. NVL、NVL2与COALESCE函数: - `NVL(column, default_value)`:如果column为NULL,则返回default...

    oracle中的null_考试题目

    - 第2题中,由于`where 1=2`条件不成立,所以查询结果集中没有行,`SUM`结果为`NULL`。 - **选项分析**: - A. `NULL`: 正确,因为查询结果为空。 - B. `0`: 错误,`SUM`函数对于空集合返回`NULL`而不是`0`。 - ...

    Oracle中的SUM用法讲解

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的SQL功能,包括聚合函数SUM。SUM函数用于对指定列的数据进行求和,常用于统计分析。在Oracle中,SUM函数可以结合CASE WHEN语句,使得条件求和变得...

    oracle 创建wm_concat函数

    在这里,我们将`sum_string`字段设置为`NULL`。 2. **迭代函数(ODCIAggregateIterate)**:每当处理一行数据时都会调用此函数。在这个函数中,我们检查`sum_string`是否为空,如果不为空,则将新值附加到现有的字符...

    oracle函数介绍(6) 著名函数之分析函数.doc

    LAG函数返回当前行之前n行的列值,如果超出范围,可指定返回的默认值,否则默认为NULL。 8. LEAD(col[,n][,n]) over([partition_clause] order_by_clause) LEAD函数与LAG相反,它返回当前行之后n行的列值。 以上...

    oracle 函数大全整理

    `expression`是你想要检查是否为NULL的表达式,`replacement_value`则是当`expression`为NULL时返回的替换值。 在给定的例子中,NVL函数被用来处理字段的合计值。例如: ```sql SELECT nvl(sum(t.dwxhl),1) FROM ...

    Oracle常用函数

    - **NVL和NVL2**:用于处理NULL值,NVL将NULL替换为指定的默认值,NVL2在第一个参数为NULL时返回第二个参数,否则返回第三个参数。 - **TRIM**:去除字符串两端的空格或指定字符。 - **LNNVL**:逻辑非NULL值,当...

    ORACLE数据库及SQL语言考试题一含答案.pdf

    区别:Primary key 的 1 个或多个列必须为NOT NULL ,如果列为NULL ,在增加 PRIMARY KEY时,列自动更改为 NOT NULL 。而 UNIQUE KEY 对列没有此要求。一个表只能有一个PRIMARY KEY,但可以有多个UNIQUE KEY 。 2. ...

    oracle非数字合计,将字段中含有汉子的数据自动转换为 数字0

    - **nvl2**:此函数用于判断条件是否为NULL,并返回不同的值。在这里,如果`translate`后的结果是空(即全部为数字),则返回原字符串`column_name`;否则,即字符串中存在非数字字符时,返回'0'。 最终,通过`to_...

    如何将数据库中的NUll写入到数据库中去

    虽然SQL标准定义了如何处理NULL,但不同的数据库系统(如MySQL、PostgreSQL、Oracle等)可能有自己的方言,因此在实际操作时要注意这些差异。 总之,将NULL写入数据库涉及到SQL语法、编程语言与数据库API的交互,...

    ORACLE中的经典SQL及函数

    `NVL`函数接受两个参数,当第一个参数为NULL时,返回第二个参数的值,这对于处理可能含有NULL值的数据列非常有用。 在SQL查询中,我们经常需要对数值进行计算,例如在示例中更新员工的总薪酬。如果某个员工的奖金为...

    oracle函数列表[定义].pdf

    在处理包含`NULL`值的数据时,例如在更新员工薪水和奖金时,若奖金为`NULL`,直接相加会导致结果也为`NULL`。此时,可以使用`NVL`函数确保计算正确,如`salary = (salary + NVL(bonus, 0)) * 1.1`,这样即使奖金为`...

    Oracle函数列表速查

    例如,在计算员工总补偿时(薪水+奖金),如果奖金列包含NULL值,直接相加会导致整个结果为NULL。通过`NVL(bonus, 0)`确保即使奖金为NULL,也能将其视为0进行计算。 #### 数学函数与日期函数 除了字符串函数,...

    oracle总结oracle总结面试必备

    掌握SQL的基础语法,如SELECT、INSERT、UPDATE、DELETE语句,以及联接(JOIN)、子查询、聚合函数(COUNT、SUM、AVG等)和分组(GROUP BY)等,是每个Oracle开发者的基本功。 二、创建表 创建表是数据库设计的第一...

    oracle函数大全 oracle函数大全

    除了上述函数,Oracle还提供其他很多函数,如TO_DATE用于将字符串转换为日期,TO_CHAR用于将日期转换为字符串,NVL用于处理NULL值,以及COUNT、SUM、AVG、MAX、MIN等聚合函数。了解并熟练使用这些函数,能极大地提高...

    oracle case语句的介绍

    当 `sex` 的值为 1 或 2 时,返回对应的“男”或“女”,其他情况下返回“未知”。 ##### 案例 3:统计不同性别的总人数 为了统计所有用户的性别分布,我们可以使用 SUM 函数结合 CASE 语句来计算不同性别的人数:...

    《Pro Oracle SQL》--Chapter 5--5.5 Questions about Data

    7. **聚合函数与NULL**:SUM、AVG等聚合函数在计算时会忽略NULL值,COUNT(*)会统计所有行,而COUNT(column)仅统计column非NULL的行。 8. **NULL联合**:在UNION、UNION ALL等操作中,NULL值的处理方式不同。UNION会...

Global site tag (gtag.js) - Google Analytics