很烦躁,烦躁的很,总结一下。

先简单的说下:

NULL   : 不确定的东西

无       :没有东西

复杂的见下文。。。。。。。

一 、null值

下面举个最简单的例子,平常工作当中肯定比这个sql复杂的多,在这只是把这个易错点呈现出来,他可能是一个复杂sql出错的小的 不容易被发现的一个问题。

上面是一个很简单表的所有数据。area_num 区域编码 area_name 区域名称 delflag 有无效标识 1有效 0无效(其中淮北 和宣城的delflag为null)。

现在想找出有效的那些区域信息,所以用下面的语句:

上面的结果中没有淮北和宣城 跟预想中的不一样 一开始以为是 delflag不为0的所有应该都被查询出来 包括淮北和宣城。

事实上 淮北和宣城 delflag的字段是 null值。在oracle里面null值得概念:

NULL是数据库中特有的数据类型,当一条记录的某个列为NULL,则表示这个列的值是未知的、是不确定的。既然是未知的,就有无数种的可能性。因此,NULL并不是一个确定的值。

所以null值(不确定的值) 并不符合 !='0' 这个 条件。同样下面语句也是这样。

二、无结果

无结果其实就是一个select查询没有结果集(不是null,而是没有结果)

结果为null:

无结果:

表面看很的清楚明白,但是到了实际应用中可能 会容易搞错。

下面是示例的存储过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
create or replace function getProceessidAllDealBySkf_l(proceessid in number)
  return varchar2 as
  cursor pcursor is(
    select distinct t.orgid, t.oper_name
      from tssa_his_dsg.wh_common_busilog_td t
     where t.processinstid = proceessid);--取操作日志表某个工单流程proceessid的操作人所属机构id,和操作名称
  orgidCursor   pcursor%rowtype;--定义类型为pcursor行数据的 变量
  orgid_var     varchar2(20);--存放操作人机构id变量
  returnflag    varchar2(20);--返回的标志位
  orgseqflag    varchar2(50);--操作人机构id及其所有父id 串起来字符
  skforgflag    varchar2(20);--存放操作人机构id变量
  count_var     number;--存放统计数字变量
  oper_name_var varchar2(100);--操作名称
begin
  returnflag    := '1';--返回值初始化为1
  orgseqflag    := null;--初始化
  skforgflag    := null;--初始化
  count_var     := 0;--初始化
  oper_name_var := null;--初始化
  open pcursor;--打开游标
 
  loop
    fetch pcursor
      into orgidCursor;--把游标数据放进pcursor变量
    exit when pcursor%notfound;
   
    orgid_var     := orgidCursor.orgid;--从orgidCursor变量取值到orgid_var
    oper_name_var := orgidCursor.oper_name;--从orgidCursor变量取值到oper_name_var
   
    if (orgid_var is null) then--orgid_var是可能为空的 表里面t.orgid为空
      null;
    else
      select count(1)
        into count_var
        from tssa_dsg.eosorg_t_organization b,
             (select a.*
                from tssa_dsg.bndict_t_dictionary a
               where a.BUSINTYPEID = 'WH_CH_ORAPROPERTY'
                 and a.status = '0') a
       where b.orgproperty = a.businid(+)
         and b.orgid = orgid_var;--统计操作日志表的机构id是否在机构静态表里
      if (count_var > 0) then--在里面
        select t.orgseq
          into orgseqflag
          from tssa_dsg.eosorg_t_organization t
         where t.orgid = orgid_var
        --取orgseqflag
        ;
        select a.businname
          into skforgflag
          from tssa_dsg.eosorg_t_organization b,
               (select a.*
                  from tssa_dsg.bndict_t_dictionary a
                 where a.BUSINTYPEID = 'WH_CH_ORAPROPERTY'
                   and a.status = '0') a
         where b.orgproperty = a.businid(+)
           and b.orgid = orgid_var;--取组织分类
       
        if (orgseqflag like '99999.7676.%' or skforgflag = '省客服' or
           (skforgflag != '省客支' and skforgflag != '省层面' and
           oper_name_var = '话务员追加信息')) then
          null;
        else
          returnflag := null;--不满足id条件 置返回值为null
        end if;
      end if;
    end if;
  end loop;
  close pcursor;
  return returnflag;
end;

上面这个过程的作用就是根工单流程id 返回该工单是否只经过某个特定组织机构的人处理的标志。

操作日志表的orgid有为空的情况。
if(orgid_var is null) 这个条件 判断如果为空 视该记录无效,不参与判断(业务要求)。

如果不加这个条件 (且没有

1
2
3
4
5
6
7
8
9
select count(1)
        into count_var
        from tssa_dsg.eosorg_t_organization b,
             (select a.*
                from tssa_dsg.bndict_t_dictionary a
               where a.BUSINTYPEID = 'WH_CH_ORAPROPERTY'
                 and a.status = '0') a
       where b.orgproperty = a.businid(+)
         and b.orgid = orgid_var;--统计操作日志表的机构id是否在机构静态表里

下面这个语句

1
2
3
4
select t.orgseq
          into orgseqflag
          from tssa_dsg.eosorg_t_organization t
         where t.orgid = orgid_var

查出来是没有结果的 就是无值

1
into orgseqflag

就会报错(调试会报错,直接运行不报错) 直接 跳出 loop 给 return 一个null 值 是不符合业务要求的。

1
2
3
4
5
6
7
8
9
10
select count(1)
        into count_var
        from tssa_dsg.eosorg_t_organization b,
             (select a.*
                from tssa_dsg.bndict_t_dictionary a
               where a.BUSINTYPEID = 'WH_CH_ORAPROPERTY'
                 and a.status = '0') a
       where b.orgproperty = a.businid(+)
         and b.orgid = orgid_var;--统计操作日志表的机构id是否在机构静态表里
if (count_var > 0) then--在里面

上面这个条件作用跟if(orgid_var is null)是一样的 是忽略 操作日志表的机构id不在机构静态表里的情况。

SQL 中【NULL】和【无】烦躁的问题的更多相关文章

  1. sql中NULL的问题

    sql中NULL的问题   今天一不小心在sql中写出以下脚本 select defaultPositionId from TableName where UserId=1100528 and def ...

  2. sql中null 和 ‘’(空字符串)

    sql 中 null  和 空字符串的区别方式 在Silverlight中  数据库 需要与实体类进行映射, 假如实体类不允许为null,则 select '' as 列名  from  表名字:   ...

  3. SQL中null比较的雷区

    SQL中遇到null要格外小心! oracle最坑: oracle中在可为null的字段上做逻辑关系运算要格外小心,如 <>,>,=,<,任何与null的运算结果都返回fals ...

  4. SQL中NULL值

    SQL的表达式,除了IS NULL和NOT NULL以外,只要出现NULL值结果都为FALSE 简单的例子: SELECT * FROM table WHERE name!='abc' 只要name值 ...

  5. SQL中NULL的妙用

    商品表Products 库房表WarehouseDistrict 库存表WarehouseStock 一般写法 ;WITH stock AS ( SELECT DistrictId, ProductI ...

  6. SQL语句中=null和is null

    平时经常会遇到这两种写法:IS NOT NULL与!=NULL.也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合.实际上,是由于对二者使用区别理解不透彻. 默认情况下,推荐使用 IS ...

  7. sql server中NULL导入decimal字段时报错

    sql server中NULL导入decimal字段时报错 在导入CSV文件时,如果decimal字段为null值,导致文本文件入库时失败. 错误现象 构造例子 新建一张表,包含decimal字段. ...

  8. SQL中的Null深入研究分析

    SQL中的Null深入研究分析 虽然熟练掌握SQL的人对于Null不会有什么疑问,但总结得很全的文章还是很难找,看到一篇英文版的, 感觉还不错. Tony Hoare 在1965年发明了 null 引 ...

  9. SQL中空值与NULL区别

    很多人都有过这样的问题吧   在SQL中填充空值与NULL有什么区别 现在我以一个实例给大家分享一下自己的想法  恳请大家给予批评也指正 谢谢 创建一个监时表 CREATE TABLE #temp ( ...

随机推荐

  1. Struts2之Action三种接收参数形式与简单的表单验证

    有了前几篇的基础,相信大家对于Struts2已经有了一个很不错的认识,本篇我将为大家介绍一些关于Action接收参数的三种形式,以及简单的表单验证实现,下面进入正题,首先我们一起先来了解一下最基本的A ...

  2. magent实现memcached集群的一个问题

    之前我们小组封装了一个memcached类库,里面有一个名为RemoveStartWith的方法可以根据起始字符串删除所有节点中负责键值规则的缓存项.它实现的原理就是通过stats命令获取每个节点的所 ...

  3. Ubuntu 16.04系统下解决Vim乱码问题

    方法: 打开终端输入:vim /etc/vim/vimrc,进入编辑模式,加入如下配置: set fileencodings=utf-8,gb2312,gbk,gb18030 set termenco ...

  4. How are you vs How are you doing

    How are you与How are you doing,有何不同呢? 貌似没有不同…… 中国教科书式的回答是"Fine, thank you, and you?" 随便一点&q ...

  5. c++的矩阵乘法加速trick

    最近读RNNLM的源代码,发现其实现矩阵乘法时使用了一个trick,这里描述一下这个trick. 首先是正常版的矩阵乘法(其实是矩阵乘向量) void matrixXvector(float* des ...

  6. iOS - Reveal逆向分析任意iOS应用的UI界面

    在iOS逆向工程中,Reveal扮演着重要角色,一般情况下,Reveal在iOS开发过程中可以分析UI界面的状态,同样也可以应用于分析其他任意的App.Reveal是一个很强大的UI分析工具,可非常直 ...

  7. vs中如何添加库目录、包含目录以及依赖-----转

    在生成时,可能需要首先生成某些项目,以便生成由其他项目使用的可执行代码.使用 “解决方案属性页”对话框 ->“通用属性”->“项目依赖项” 设置当前生成顺序.若要访问此对话框,请在“解决方 ...

  8. 51nod 1009 - 数字1的数量 - [数位DP][模板的应用以及解释]

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 基准时间限制:1 秒 空间限制:131072 KB 给 ...

  9. CodeForces - 798D Mike and distribution 想法题,数学证明

    题意:给你两个数列a,b,你要输出k个下标,使得这些下标对应的a的和大于整个a数列的和的1/2.同时这些下标对应的b //题解:首先将条件换一种说法,就是要取floor(n/2)+1个数使得这些数大于 ...

  10. HDU - 5969 最大的位或 想法题

    http://acm.hdu.edu.cn/showproblem.php?pid=5969 (合肥)区域赛签到题...orz 题意:给你l,r,求x|y的max,x,y满足l<=x<=y ...