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 ...
随机推荐
- transiton,transform,animation,border-image
animation,transition,transform三者联系与区别: https://www.jianshu.com/p/0e0e1903b80d transform: 使用小技巧: tran ...
- 用servlet实现用户登录案例
以下实现登录窗口 Login.jsp <!--Login.jsp--> <%@ page language="java" import="java.ut ...
- Python基础学习(第4天)
Python进阶 第1课:词典(dictionary) 1.词典可以存储多个元素,存储多个元素的对象称为容器(container) 第2课:文本文件的读取写入 1.打开一个文件,用对象来代表这个文件 ...
- 如何用UltraEdit查看并修改Oracle导出的dump文件的字符集
如何查询dmp文件的字符集 用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集.如果dmp文件不大,比如只有几M或几十M,可以用Ultr ...
- Day17作业及默写
正则表达式练习 1.匹配一篇英文文章的标题 类似 The Voice Of China ([A-Z][a-z]*)( [A-Z][a-z]*)* 2.匹配一个网址 https://www.baidu. ...
- Python 面向对象和面向过程对比
# 大象装冰箱 # 脚本, 此时代码是最简单的. 不需要构思整个程序的概况 print("开门") print("装大象") print("关门&qu ...
- 使用solr报错
2017-11-15 20:15:18 错误介绍: 错误原因:url错误 错误解决:换成正确
- angular上传获取图片的directive指令
在AngularJS中,操作DOM一般在指令中完成,那么指令是如何实现的呢?指令的作用是把我们自定义的语义化标签替换成浏览器能够认识的HTML标签 一般的事件监听是在对静态的dom绑定事件,而如果在指 ...
- Java小故事(一)
import java.util.Date; //导入包 public class Test11 { public static void main(String [] args){ CatFathe ...
- 2.5 SeleniumBuilder辅助定位元素
前言对于用火狐浏览器的小伙伴们,你还在为定位元素而烦恼嘛?上古神器Selenium Builder来啦,哪里不会点哪里,妈妈再也不用担心我的定位元素问题啦!(但是也不是万能,基本上都能覆盖到) 2.5 ...