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不在机构静态表里的情况。
SQL 中【NULL】和【无】烦躁的问题的更多相关文章
- sql中NULL的问题
sql中NULL的问题 今天一不小心在sql中写出以下脚本 select defaultPositionId from TableName where UserId=1100528 and def ...
- sql中null 和 ‘’(空字符串)
sql 中 null 和 空字符串的区别方式 在Silverlight中 数据库 需要与实体类进行映射, 假如实体类不允许为null,则 select '' as 列名 from 表名字: ...
- SQL中null比较的雷区
SQL中遇到null要格外小心! oracle最坑: oracle中在可为null的字段上做逻辑关系运算要格外小心,如 <>,>,=,<,任何与null的运算结果都返回fals ...
- SQL中NULL值
SQL的表达式,除了IS NULL和NOT NULL以外,只要出现NULL值结果都为FALSE 简单的例子: SELECT * FROM table WHERE name!='abc' 只要name值 ...
- SQL中NULL的妙用
商品表Products 库房表WarehouseDistrict 库存表WarehouseStock 一般写法 ;WITH stock AS ( SELECT DistrictId, ProductI ...
- SQL语句中=null和is null
平时经常会遇到这两种写法:IS NOT NULL与!=NULL.也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合.实际上,是由于对二者使用区别理解不透彻. 默认情况下,推荐使用 IS ...
- sql server中NULL导入decimal字段时报错
sql server中NULL导入decimal字段时报错 在导入CSV文件时,如果decimal字段为null值,导致文本文件入库时失败. 错误现象 构造例子 新建一张表,包含decimal字段. ...
- SQL中的Null深入研究分析
SQL中的Null深入研究分析 虽然熟练掌握SQL的人对于Null不会有什么疑问,但总结得很全的文章还是很难找,看到一篇英文版的, 感觉还不错. Tony Hoare 在1965年发明了 null 引 ...
- SQL中空值与NULL区别
很多人都有过这样的问题吧 在SQL中填充空值与NULL有什么区别 现在我以一个实例给大家分享一下自己的想法 恳请大家给予批评也指正 谢谢 创建一个监时表 CREATE TABLE #temp ( ...
随机推荐
- Android 基于 Speex 的高度封装语音库,0 耦合,没三方jar包
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- 【LOJ6254】最优卡组 堆(模拟搜索)
[LOJ6254]最优卡组 题面 题解:常用的用堆模拟搜索套路(当然也可以二分).先将每个卡包里的卡从大到小排序,然后将所有卡包按(最大值-次大值)从小到大排序,并提前处理掉只有一张卡的卡包. 我们将 ...
- 在jmeter测试中模拟不同的带宽环境
怎么去测试在手机app中和在web的不同的连接速度对服务器的影响呢? 大部分情况下,手机终端用户通过移动网络访问网站.所以在不同的网络连接数据下,我们的网站或程序可以同时处理多少链接?今天,这篇文件就 ...
- MONGOOSE – 让NODE.JS高效操作MONGODB(转载)
Mongoose库简而言之就是在node环境中操作MongoDB数据库的一种便捷的封装,一种对象模型工具,类似ORM,Mongoose将数据库中的数据转换为JavaScript对象以供你在应用中使用. ...
- 解决IE6下透明图片有背景的问题
描述,透底的图片,在其他浏览器中效果: 在IE6中的效果: 1.改图片 IMG 换用gif格式的图片,但是这样的话图片效果不好: 想让IE6用gif的图片,其他浏览器用png图片,但是只有IE有这样 ...
- python添加Windows环境变量
1.cmd中添加方式 SET PATH=%PATH%;c:\Program Files (x86)\Wireshark 注:如上代码添加c:\Program Files (x86)\Wireshark ...
- openstack 部署(Q版)-----Mysql、MQ、Memcached安装配置
一.安装mysql yum install -y mariadb mariadb-server python2-PyMySQL 配置my.cnf文件 vim /etc/my.cnf [mysqld] ...
- 天梯赛 大区赛 L3-014.周游世界 (Dijkstra)
L3-014. 周游世界 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 周游世界是件浪漫事,但规划旅行路线就不一定了-- 全世 ...
- 掌握新变革,解密新趋势|msup第29届MPD软件管理工作坊成功召开
由msup主办的第29届MPD软件管理工作坊于7月9日-7月10日在北京国家会议中心举行,25位一线讲师,近500名软件研发工作者共同探讨软件研发与科技发展趋势. 随着移动互联网的发展,软件开发行业的 ...
- 【紫书】【重要】Abbott's Revenge UVA - 816 bfs 复杂模拟 带方向参数的迷宫
题意:一个迷宫,每个交叉路口有一路标,限制了你从某方向进入该路口所能进入的路口. 题解:1.对于方向的处理:将node多增加一维dir,通过一个const 字符数组 加 上dir_id函数 以及一个方 ...