`

Oracle 空值计算总结(踩过不少坑)

 
阅读更多
CREATE TABLE T1 (ID INT ,ID1 INT);
INSERT INTO T1 VALUES(1,NULL);
INSERT INTO T1 VALUES(NULL,NULL);
INSERT INTO T1 VALUES(2,2);
COMMIT;

--实际上有三条记录,包括两个字段都为空的记录
admin@ORCL> SELECT * FROM T1;

        ID        ID1
---------- ----------
         1         NULL
         2          2
        NULL       NULL


admin@ORCL> SELECT COUNT(*) FROM T1;

  COUNT(*)
----------
         3

admin@ORCL> SELECT COUNT(ID) FROM T1;

 COUNT(ID)
----------
         2

admin@ORCL> SELECT COUNT(ID1) FROM T1;

COUNT(ID1)
----------
         1
--空值的SUM测试
admin@ORCL> SELECT SUM(ID) FROM T1;--SUM值不考虑空值

   SUM(ID)
----------
         3
admin@ORCL> SELECT AVG(ID) FROM T1;--AVG只除以了非为空的记录条数

   AVG(ID)
----------
       1.5

admin@ORCL> SELECT SUM(ID1) FROM T1;

  SUM(ID1)
----------
         2
         
admin@ORCL> SELECT AVG(ID1) FROM T1;--avg只除以了非空的记录条数

  AVG(ID1)
----------
         2
--相加测试,NULL+NOT NULL VALUE = NULL
admin@ORCL> SELECT ID+ID1 FROM T1;

    ID+ID1
----------
        NULL
         4
--MAX与MIN测试,最大值和最小值也不包含空
admin@ORCL> select max(ID) from t1;

   MAX(ID)
----------
         2

admin@ORCL> select min(ID) from t1;

   MIN(ID)
----------
         1
--排序测试

select * from t1 order by id;

admin@ORCL> select * from t1 order by id;--默认是升序,可以看出NULL 默认最大

        ID        ID1
---------- ----------
         1         NULL
         2          2
        NULL       NULL

admin@ORCL> select * from t1 order by id1;

        ID        ID1
---------- ----------
         2          2
        NULL       NULL
         1         NULL
--加上 NULLS first,将空值设为第一位

admin@ORCL> select * from t1 order by id nulls first;

        ID        ID1
---------- ----------

         1
         2          2

--distinct会包含null
admin@ORCL> select distinct id from t1;

        ID
----------
         1

         2



--1.NULL值对IN的查询无太影响
SELECT *
  FROM PRODUCT_BASE
 WHERE PRODUCT_CODE IN (SELECT 'C10104107000015'
                          FROM DUAL
                        UNION ALL
                        SELECT NULL FROM DUAL);
--2.NULL值对NOT IN的查询有影响,会导致全部数据查询不出来
SELECT *
  FROM PRODUCT_BASE
 WHERE PRODUCT_CODE IN (SELECT 'C10104107000015'
                          FROM DUAL
                        UNION ALL
                        SELECT NULL FROM DUAL);
--结论 in与not in 会跟括号里面的值进行比较是否相等从而得出判断结果,而在oracle中null
进行比较都是返回false.
--3.EXIST值对NULL的查询无影响
SELECT *
  FROM PRODUCT_BASE
 WHERE EXISTS (SELECT 1
          FROM (SELECT 'C10104107000015' AS ID
                  FROM DUAL
                UNION ALL
                SELECT NULL FROM DUAL) T
         WHERE T.ID = PRODUCT_CODE);
--3.NOT EXIST值对NULL的查询无影响
SELECT *
  FROM PRODUCT_BASE
 WHERE NOT EXISTS (SELECT 1
          FROM (SELECT 'C10104107000015' AS ID
                  FROM DUAL
                UNION ALL
                SELECT NULL FROM DUAL) T
         WHERE T.ID = PRODUCT_CODE);
         
--结论 
--exists与not exists相当于一种逻辑判断,exists 的本质就是返回一个布尔值,
--exists测试关联子查询是否有数据返回,如果有至少一行返回的话则exists判断为真返回true,
--not exists判断关联子查询是否没有数据返回, 如果没有数据返回则判断为真,返回true。

以下为踩过的坑。。。。。
1.merge 关联时, null与null关联不上, 导致数据都被insert进去,而非更新。
如下示例,A表的xx1与b表的xx1都为null,关联不上。
merge into  A
using(select * from B) on a.id = B.id and a.xx1 = b.xx1 
when matched then
when not matched then insert

2.merge关联后,两个字段相加null+数字仍然为空。具体场景为计算累加值,而上日无此维度累加值且未设置默认值为0,导致计算结果为null。
merge into A
using (select * from b) b on a.id = b.id
when matched
then update set A.amount = A.amount + B.amount(null)

3.数据清理时, 
通过create table 再drop 原表rename的方式清理,取日期大于某个值的数据(业务上要求要包括null记录)。
create table T  select * from source where source.date >= sysdate - 90;

 

分享到:
评论

相关推荐

    oracle处理空值的方法

    处理空值是数据库操作中常见的需求,特别是在数据查询、聚合计算和数据清洗等场景下。Oracle提供了多种方法来处理空值,包括使用NVL、NVL2、COALESCE函数,以及CASE和DECODE语句。下面将详细介绍这些方法及其应用...

    关于oracle空值的解决方法[收集].pdf

    总结,Oracle中的空值处理需要理解其特性和行为,并合理运用NVL等函数进行转换。同时,通过创建适当的索引可以进一步提升含有空值字段的查询性能。在数据库设计时,应谨慎考虑是否允许字段为空,以及如何处理可能...

    Oracle数据库空值应用方法研究.pdf

    Oracle数据库是关系型数据库管理系统的一种,其在处理空值(NULL)方面有着独特的规则和应用方法。空值在数据库中通常表示未知、不适用或无意义的数据,它不是一个具体的数值,而是一个标识,表明某个属性的值缺失。...

    韩顺平Oracle课堂资料总结

    ### 韩顺平Oracle课堂资料总结 #### 一、Oracle权限管理与操作 ##### 权限概述 在Oracle数据库中,权限管理是确保数据安全的重要手段之一。权限分为系统权限(System Privileges)和对象权限(Object Privileges)...

    SYBASE iq与ORACLE使用分析函数计算同期值及常用计算函数使用

    "SYBASE iq与ORACLE使用分析函数计算同期值及常用计算函数使用" 本资源摘要信息主要介绍了SYBASE iq和ORACLE中使用分析函数计算同期值和常用计算函数的使用方法。文章涵盖了同期值的计算、累计及同期累计值的计算、...

    Oracle数据库的学习总结一

    ### Oracle数据库学习总结知识点 #### 1. 数据表的基本操作 - **创建表**: 使用 `CREATE TABLE` 语句创建新的表。例如:`CREATE TABLE student (name VARCHAR2(20), age NUMBER(3));` - **插入记录**: 使用 `...

    oraclesql判断值为空-Oracle-sqlserver的空值(null)判断.pdf

    Oracle SQL 中判断值为空或 Null 的方法有多种,在本文中,我们将介绍 Oracle 和 SQL Server 中的空值判断方法。 Oracle 中的空值判断 在 Oracle 中,可以使用 `NVL` 函数来判断值为空或 Null。`NVL` 函数的语法...

    oracle中的空值技巧[参考].pdf

    在Oracle数据库中,空值(NULL)是一种特殊的数据状态,表示某个字段的值未知或不存在。这个概念在软件开发,尤其是涉及数据库管理的领域里至关重要。Oracle允许任何数据类型的列出现空值,只要该列没有被非空约束...

    oracle个人总结

    Oracle数据库是世界上最广泛使用的数据库管理系统之一,主要用于存储和管理企业级的数据。以下是对Oracle的一些关键知识点的详细说明: 1. **登陆与用户管理**: - 使用`sqlplus`命令行工具,通过`conn 用户名/...

    oracle index学习总结

    3. Index skip scan:对于范围查询,Oracle可以跳过部分索引节点,提高查询效率。 四、索引使用策略 1. 适当索引:为经常出现在WHERE子句中的列创建索引,避免对更新频繁的列建索引。 2. 分析与调整:定期运行`...

    Oracle复合索引与空值的索引使用问题小结

    如果A列没有空值,但B列允许空值,那么在计算如`min(B)`这样的聚合函数时,Oracle可能不会使用这个复合索引。原因是,由于B列可以为空,索引中可能不存在某些记录的B值,而计算最小值时必须检查所有记录以确认是否有...

    Oracle NULL值的比较函数(是NULL=NULL为真的函数)

    你是否也为在Oracle里如何实现NULL的比较而犯愁呢?

    oracle学习总结

    ### Oracle学习总结 #### SQL基础语法 1. **数据定义语言(DDL)** - **创建表**:`CREATE TABLE table_name (column_name datatype constraints,...);` - `NOT NULL`:指定列不允许有空值。 - `UNIQUE`:指定列...

    Oracle基本知识总结.docx

    Oracle 基本知识总结 Oracle 是一种关系型数据库管理系统,广泛应用于各种行业。这里对 Oracle 基本知识进行总结,包括用户管理、归档模式、版本查看、闪回区信息、表空间管理、Spool 命令、脚本执行、登录方法等。...

    oracle class12.jar nls_charset12.jar存储过程接收数组空值

    "oracle class12.jar nls_charset12.jar存储过程接收数组空值"这个标题所描述的,就是关于在Oracle 11g中解决这个问题的具体实践。 首先,`class12.jar`和`nls_charset12.jar`是Oracle数据库的Java存根库,它们包含...

    oracle建表命令总结

    以下是对Oracle建表命令和相关约束的详细总结: 1. **主键(Primary Key)**: 主键是用来唯一标识表中每一条记录的关键字段,不允许有重复值且不能为空。在Oracle中,可以使用`PRIMARY KEY`关键字来创建主键约束...

    Oracle 行列转换总结

    ### Oracle 行列转换知识点详解 #### 一、概述 在数据库操作中,行列转换是一项非常实用的功能,尤其是在处理报表数据或需要特定格式输出时。本文档将详细讲解Oracle数据库中的行列转换方法,并通过具体实例来说明...

    空值的判断,空值的过滤,补全空值.ipynb

    空值的判断,空值的过滤,补全空值.ipynb

    matlab 空值预处理

    MATLAB作为一种强大的数值计算和数据分析工具,提供了丰富的函数和方法来处理数据中的空值(NaN,Not a Number)。本教程将围绕“matlab 空值预处理”这一主题,详细介绍如何使用MATLAB处理数值型和字符型数据中的...

    MySQL数据库:空值比较.pptx

    数据查询;;空值比较;... 在使用算术运算符+、-时,如果参与运算的值出现空值,则导致计算结果为空值。 SELECT 图书编号,数量+10 FROM book; ;空值的概念 空值比较的方法 空值在数据运算中的特殊情况 ;谢谢

Global site tag (gtag.js) - Google Analytics