oracle-null和默认值
Oracle的默认值处理要当心,如果应用中使用的是ORM工具,则必须要考虑对于字段为Null的处理,必要时在ORM工具中将Null转换为default或插入时去掉值为Null的字段。
可以将下面的系统属性作为默认值:
SYSDATE:系统时间
SYS_CONTEXT:系统上下文
USER:当前数据库用户
USERENV:用户环境变量,可以获取一些IP地址、协议、终端的信息
需要注意,默认值不能使用LEVEL、PRIOR、ROWNUM,会报ORA-00976错误。
应用中使用默认值的常见场景是主键或自增列。正如我们所知,Oracle并未提供自增类型,这就需要我们结合默认值进行二次开发,通过默认值实现系统应用的透明。这里结合笔者的经验,提供两种方案:
触发器+序列
因为Oracle不支持在default中使用序列,因此我们只能使用触发器来实现。
如果你工作中用到了Oracle,你必须要留意NULL和空值的处理与SQL Server上的不同.现在让我们看些例子。
建立这张数据库表并插入记录
CREATE TABLE TestNull(Col2 VARCHAR(100));
INSERT INTO TestNull VALUES(NULL);
INSERT INTO TestNull VALUES('Bla');
INSERT INTO TestNull VALUES('');
INSERT INTO TestNull VALUES(' ');
如你所见我们插入了4条记录,一条记录是null,一条记录是空值,一条记录是空格,一条记录是"Bla".
让我们执行下面的查询语句:
SELECT Col2,
NVL(Col2,'EmptyOrNull') a,
COALESCE(Col2,'EmptyOrNull') b,
ASCII(col2) c
FROM TestNull;
看看发生了什么,Oracle把空值转变成了 NULL。
Coalesce函数的差别
要知道coalesce 函数工作原理不一样. Oracle没有isnull函数但有nvl函数来取代。
运行下面2句sql。
SELECT NVL('','No') AS a FROM dual;
SELECT COALESCE('','No') AS a FROM dual;
在这2种情况下你得到“No”返回值, 如你所见空值被当做null处理.
知道了Oralce和SQL Server的这些差别,如果你认为他们工作原理相同你会得到些奇怪的查询结果。
今天突然才发现,Oracle中的“不等于操作符”是忽略Null的。
比如,查询comm不等于的300的记录,我会理所当然地使用where comm != 300
预想会返回包含Null的不等于300的记录(意识里认为Null也是“不等于30”的其中一种情况)。
而实际上,它只返回不为Null且不等于300的记录,见如下测试。
事实上,并不仅仅“不等于号”与Null的关系是如此的,其他操作符也类似,只不过“不等于号”使用场景的特殊性让我们容易发觉此特性。
create table t1(name varchar2(20),year number);
insert into t1 values('t12001',2001);
insert into t1 values('t12002',2002);
insert into t1 values('t12003',2003);
insert into t1 values('t12004',2004);
insert into t1 values('t12005',null);
insert into t1 values('t12006',2006);
insert into t1 values('t12007',null);
insert into t1 values('t12008',2008);
insert into t1 values('t12009',2009);
insert into t1 values('t12010',2010); --下面这样是查不到空的行
select * from t1
where year !=2001
--要么下面这个
select * from t1
where year !=2001 or year is null;
--要么下面这个,这个更方便
select * from t1
where lnnvl(year = 2001); LNNVL provides a concise way to evaluate a condition when one or both operands of
the condition may be null.
lnnvl提供一个简明的方式来计算一个条件,当一个或条件的两个操作数可能为空时
concise adj. 简明的,简洁的
oracle-null和默认值的更多相关文章
- 查看Oracle latch _spin_count默认值
查看Oracle latch _spin_count默认值 SELECT X.KSPPINM NAME, Y.KSPFTCTXVL VALUE, Y.KSPFTCTXDF ISDEFAULT FRO ...
- 【杂记】mysql 左右连接查询中的NULL的数据筛选问题,查询NULL设置默认值,DATE_FORMAT函数
MySQL左右连接查询中的NULL的数据筛选问题 xpression 为 Null,则 IsNull 将返回 True:否则 IsNull 将返回 False. 如果 expression 由多个变量 ...
- SQL SERVER 查看数据库表的字段类型,是否允许为NULL,默认值,主键等
)-- 表名 set @table_name='bqcform101' --============表结构 select 类别,表名or字段名,描述,字段类型,是否自增,允许为NULL,默认值 fro ...
- 4.03 使用NULL代替默认值
问题:在一个定义了默认值的列插入数据,并且需要不管该列的默认值是什么,都将该列值设为NULL.考虑一下下面的表: create table D (id interger default 0, foo ...
- 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)
1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...
- SQL 语句修改列名 属性 默认值
--修改字段名exec sp_rename '表名.列名','新列名' --修改字段属性alter table 表名 alter column 列名 nvarchar(100) null; --修改默 ...
- Django model.py表单设置默认值允许为空
blank=True 默认值为blank=Flase,表示默认不允许为空, blank=True admin级别可以为空 null=True 默认值为null=Flase,表示默认不允许为空 nu ...
- [原创] Shell 参数传递 与 默认值
目录 简介 基本传参 $* 与 $@ 区别 默认参数(变量默认值) if 繁琐方式 - 变量为null = 变量为null时, 同时改变变量值 :- 变量为null 或 空字符串 := 变量为null ...
- Sqlserver添加加字段、删除字段、修改字段类型、修改字段名、修改字段默认值
参考:https://www.cnblogs.com/pangpanghuan/p/6432331.html 初始化表: --.添加字段 --1.1.为null alter table DataTab ...
- Oracle数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)
查询表信息(表名/表描述) Select table_Name As Name,Comments As Value From User_Tab_Comments Where table_Type='T ...
随机推荐
- 【模板】AC自动机(简单版)
我:“woc...AC自动机?” 我:“可以自动AC???” 然鹅... 大佬:“傻...” 我:“(⊙_⊙)?” 大佬:“缺...” 我:“......” (大佬...卒 | 逃...) emm.. ...
- 从原理上理解如何由震源机制一个节面的解:strike,dip,rake可以求出另一个节面的解
首先,需要回到最原始的地震矩的表达式: 已知strike,dip,rake 根据strike和dip可以求出v,根据strike,dip,rake,可以求出u. 把求出来的v和u互换,相当于原来的位错 ...
- <Consistency><of HBase><CAP><ACID>
Overview 讨论一些(分布式)(存储)系统的一致性 CAP原理 随着分布式事务的出现,传统的单机事务模型(ACID)已经无法胜任,尤其是对于一个高访问量.高并发的互联网分布式系统来说. 如何构建 ...
- get 和post 请求的写法
get请求 import requests base_url = 'http://httpbin.org' # 定义请求所需的参数,参数之间以英文逗号隔开 param_data = {'} # 发送G ...
- C++面试常见考点
这两周参加了3家公司的面试,一家是做嵌入式的外企,一家是做智能家居的初创公司,一家是做网络分析的公司. 通过参加面试,越发的觉得语言只是基础,虽然都是计算机领域,但是不同的业务肯能用到的技术不同,所以 ...
- kbmMWUnidac直接SQLServer
UniDAC支持SQLServer直联了,当时就测试过在kbmMW中用直联方式,结果不尽人意,kbmMWServer在执行sql时会出地址错误,就一直没有进一步测试.今天听xalion说,是因为当直联 ...
- LeetCode--122、167、169、189、217 Array(Easy)
122. Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price ...
- 绕过Snoopy的记录功能
不讲原理,感兴趣请看http://blog.rchapman.org/posts/Bypassing_snoopy_logging/,这个只适合老版本内核的Linux 查看是否有snoopy加载了 l ...
- JAVA的设计模式之观察者模式----结合ActiveMQ消息队列说明
1----------------------观察者模式------------------------------ 观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的 ...
- java杨辉三角和空心菱形(二维数组篇)
一.杨辉三角 import java.util.Scanner; //导入包 public class Test7 { public static void main(String[]args){ S ...