Oracle NULL 和空值
2014-03-12 11:36
295 查看
如果你工作中用到了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".INSERT INTO TestNull VALUES(NULL);
INSERT INTO TestNull VALUES('Bla');
INSERT INTO TestNull VALUES('');
INSERT INTO TestNull VALUES(' ');
让我们执行下面的查询语句:
SELECT Col2,
NVL(Col2,'EmptyOrNull') a,
COALESCE(Col2,'EmptyOrNull') b,
ASCII(col2) c
FROM TestNull;
下面是执行结果以html table显示。NVL(Col2,'EmptyOrNull') a,
COALESCE(Col2,'EmptyOrNull') b,
ASCII(col2) c
FROM TestNull;
![](http://static.oschina.net/uploads/space/2013/0107/082426_FE4t_12.png)
下面是执行结果的截图
![](http://static.oschina.net/uploads/img/201301/07082752_Fzpl.png)
看看发生了什么,Oracle把空值转变成了 NULL。
我们能很容易的验证这个猜想,建立一个有非NULL约束的单独一列的表。
CREATE TABLE TestNull2(Col2 VARCHAR(100) NOT NULL);
现在当你想插入一个 NULL,它会报错。
INSERT INTO TestNull2 VALUES(NULL);
这是错误信息
SQL Error: ORA-01400: cannot insert NULL into ("SYSTEM"."TESTNULL2"."COL2")
01400. 00000 - "cannot insert NULL into (%s)"
插入"Bla"字符串没有任何问题
INSERT INTO TestNull2 VALUES('Bla');
那么插入一个空值, 会报错,会发生什么呢?
INSERT INTO TestNull2 VALUES('');
SQL Error: ORA-01400: cannot insert NULL into ("SYSTEM"."TESTNULL2"."COL2")
01400. 00000 - "cannot insert NULL into (%s)"
如你所见空值被转换成NULL,你得到了和插入空值一样的错误。这和SQL Server很不一样。
插入一个空格会成功么?
INSERT INTO TestNull2 VALUES(' ');
插入空格没有问题。
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的这些差别,如果你认为他们工作原理相同你会得到些奇怪的查询结果。
1. SELECT COUNT(*) FROM DUAL WHERE '' = NULL; -- count(*)=0
2. SELECT COUNT(*) FROM DUAL WHERE '' IS NULL; -- count(*)=1
3. SELECT COUNT(*) FROM DUAL WHERE '' = ''; --count(*)=0
相关文章推荐
- 返回ADO中Getstring空值的处理
- EXTJS FORM textField emptyText 空值提交的解决办法
- batis 关于空值(NULL)的解决办法
- 可为空值的“值类型”以及其用法
- SQL Server如何保证可空字段中非空值唯一
- 空值转换函数:NVL-NVL2-NULLIF-COALESCE
- SQL Server如何保证可空字段中非空值唯一
- 将空值转换为数据库字段的NULL形式(数据库自定义查询 十分重要)
- Xfire + Spring 远程调用webservice时提示注入的对象是空值,解决办法
- 重复值和空值的处理
- Oracle SQL 空值排序(Nulls)
- 关于Oracle数据库中SQL空值排序的问题
- VC下sql+ado数据库v_strTemp.vt == VT_NULL空值处理
- JavaScript 的怪癖 2:两个「空值」:undefined 和 null
- Java 中关于String的空对象(null) ,空值(empty),空格 的总结
- “0”值(零值)与空值
- MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
- SQL排序 空值的后面
- 走出 null 就是空值的误区,以及变量赋值原理
- ibatis 插入操作 对于空值的处理