SQL 中【NULL】和【无】烦躁的问题

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

先简单的说下:

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不在机构静态表里的情况。

时间: 2024-10-10 17:55:22

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

SQL 中 Null 值使用时需要注意的地方

一.Null不支持大小/相等判断 1.下面的2个查询,不管表 users 中有多少条记录,返回的记录都是0行 select * from  users where deleted_at = null; select * from  users where deleted_at != null; 用常规的比较操作符(normal conditional operators)来将 null 与其他值比较是没有意义的. Null 也不等于 Null 2.将某个值与 null 进行比较的正确方法是使用

SQL中=null查询不出结果而is null可以查询结果说明

我们在sql中要查询某列值为null的所有结果集时,查询条件应该这样写select * from 表 where 字段 is null而使用select * from 表 where 字段 = null是查不到正确的结果的.那这是为什么呢?要清楚为什么,就需要了解sql中的三值逻辑了.在SQL中逻辑表达式的可能值包括TRUE.FALSE和UNKNOWN,它们被称之为三值逻辑. 我们知道,在其它的语言中,逻辑表达式只有两种,要么是true,要么就是false.而sql中却存在第三个逻辑表达式UnK

SQL 中 null 值的处理方式

1.查询时,如果列中的值为 null,如何为列赋默认值. SELECT ISNULL([Column],'默认值') AS [Column] FROM [DataTable]

Spark SQL中Dataframe join操作含null值的列

当在Spark SQL中对两个Dataframe使用join时,当作为连接的字段的值含有null值.由于null表示的含义是未知,既不知道有没有,在SQL中null值与任何其他值的比较(即使是null)永远不会为真.故在进行连接操作时null == null不为True,所以结果中不会出现该条记录,即左侧表格的这条记录对应右侧的值均为null.示例如下: table_a: date serverId lvSection 2018-03-04 1 10 2018-03-05 null 9 2018

Sql与oracle中null值的区别

原贴链接请点击: 1 null值的介绍 NULL 是数据库中特有的数据类型,当一条记录的某个列为 NULL ,则表示这个列的值是未知的.是不确定的.既然是未知的,就有无数种的可能性.因此, NULL 并不是一个确定的值. 这是 NULL 的由来.也是 NULL 的基础,所有和 NULL 相关的操作的结果都可以从 NULL 的概念推导出来. 2 oracle中的null值介绍 在不知道具体有什么数据的时候,即未知,可以用NULL, 称它为空,ORACLE中,含有空值的表列长度为零.允许任何一种数据

SQL语句中=null和is null

平时经常会遇到这两种写法:IS NOT NULL与!=NULL.也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合.实际上,是由于对二者使用区别理解不透彻. 默认情况下,推荐使用 IS NOT NULL去做条件判断,因为SQL默认情况下对WHERE XX!= Null的判断会永远返回0行,却不会提示语法错误. 这是为什么呢? SQL Server文档中对Null值的比较运算定义了两种规则,如在SQL Server 2000中: 规则一是是ANSISQL(SQL-92)规定的Null

SQL中的Null深入研究分析

虽然熟练掌握SQL的人对于Null不会有什么疑问,但总结得很全的文章还是很难找,看到一篇英文版的, 感觉还不错. Tony Hoare 在1965年发明了 null 引用, 并认为这是他犯下的"几十亿美元的错误". 即便是50年后的今天, SQL中的 null 值还是导致许多常见错误的罪魁祸首. 我们一起来看那些最令人震惊的情况. Null不支持大小/相等判断 下面的2个查询,不管表 users 中有多少条记录,返回的记录都是0行: select * from users where

SQL中空值与NULL区别

很多人都有过这样的问题吧   在SQL中填充空值与NULL有什么区别 现在我以一个实例给大家分享一下自己的想法  恳请大家给予批评也指正 谢谢 创建一个监时表 CREATE TABLE #temp ( name VARCHAR(50) ) 填充三条资料 如下: INSERT INTO #tempVALUES ( NULL )INSERT INTO #tempVALUES ( 'Tom' )INSERT INTO #tempVALUES ( '' ) 使用如下语法查询 SELECT COUNT(n

深入详解SQL中的Null

NULL 在计算机和编程世界中表示的是未知,不确定.虽然中文翻译为 "空", 但此空(null)非彼空(empty). Null表示的是一种未知状态,未来状态,比如小明兜里有多少钱我不清楚,但也不能肯定为0,这时在计算机中就使用Null来表示未知和不确定. 虽然熟练掌握SQL的人对于Null不会有什么疑问,但总结得很全的文章还是很难找,看到一篇英文版的, 感觉还不错. Tony Hoare 在1965年发明了 null 引用, 并认为这是他犯下的"几十亿美元的错误"