博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle 将null值转化为其他值
阅读量:4050 次
发布时间:2019-05-25

本文共 1612 字,大约阅读时间需要 5 分钟。

-- Start

我个人认为数据库中不应该有null值,因为他颠覆了二值逻辑结构(即:真和假),出现了三值逻辑结构(即:真、假和未知)。由于null,我们的SQL语句很有可能出现意想不到的结果。此外null值和其他值进行数值运算的时候也会带来问题。但是,有时候有些事情并不是我们能够控制和改变的,作为一名真正的程序员,应该敢于面对最垃圾的数据库设计。下面给大家介绍如何将null值转化为其他值。

CREATE TABLE EMPLOYEE(    NAME      VARCHAR2(20) NOT NULL,   -- 姓名    SALARY    NUMBER,                  -- 基本工资    BONUS     NUMBER                   -- 奖金);INSERT INTO EMPLOYEE VALUES ('张三', 3000.0, NULL);INSERT INTO EMPLOYEE VALUES ('李四', 4000.0, 0.0);INSERT INTO EMPLOYEE VALUES ('王五', 5000.0, 1000.0);-- 下面几条语句是等价的SELECT CASE WHEN BONUS IS NULL THEN 0.0 ELSE BONUS END FROM EMPLOYEE;SELECT COALESCE(BONUS, 0.0) FROM EMPLOYEE;SELECT NVL(BONUS, 0.0) FROM EMPLOYEE;-- 下面两条语句是等价的SELECT CASE WHEN BONUS IS NOT NULL THEN BONUS ELSE 0.0 END FROM EMPLOYEE;SELECT NVL2(BONUS, BONUS, 0.0) FROM EMPLOYEE;
假设你要查找总工资(基本工资+奖金)大于等于3000元的员工,我们很自然的会写出下面的语句:

SELECT * FROM EMPLOYEE WHERE SALARY + BONUS >= 3000.0;
但是很不幸,这条语句并不是永远正确,当SALARY或BONUS有一个值是null的时候,我们很可能会漏掉部分数据(会漏掉哪些数据呢?朋友们自己思考一下),这就是我认为数据库中不应该有null值的原因之一,如果你不是决策者,无法改变数据库设计,我们可以这样写:

SELECT * FROM EMPLOYEE WHERE NVL(SALARY, 0.0) + NVL(BONUS, 0.0) >= 3000.0;
有没有更简单的办法呢?答案是肯定的。

-- 如果条件是假或未知,LNNVL 函数返回真SELECT * FROM EMPLOYEE WHERE LNNVL(SALARY + BONUS < 3000.0);

知道了如何将 null 转换成其他值,现在让你把其他值转成 null 该怎么办呢?呵呵试一试下面的语句吧。

SELECT NULLIF(BONUS,0.0) FROM EMPLOYEE;SELECT CASE WHEN BONUS = 0.0 THEN NULL ELSE BONUS END FROM EMPLOYEE;
还有一个函数用来将 BINARY_FLOAT_NAN 和 BINARY_DOUBLE_NAN 转成其他值。

SELECT NANVL(BINARY_FLOAT_NAN, 0.0) FROM DUAL;SELECT NANVL(BINARY_DOUBLE_NAN, 0.0) FROM DUAL;

-- 更多参见:

-- 声明:转载请注明出处

-- Last Edited on 2015-06-19

-- Created by ShangBo on 2014-12-18

-- End

你可能感兴趣的文章
C#控件集DotNetBar安装及破解
查看>>
Winform皮肤控件IrisSkin4.dll使用
查看>>
Winform多线程
查看>>
C# 托管与非托管
查看>>
Node.js中的事件驱动编程详解
查看>>
mongodb 命令
查看>>
MongoDB基本使用
查看>>
mongodb管理与安全认证
查看>>
nodejs内存控制
查看>>
nodejs Stream使用中的陷阱
查看>>
MongoDB 数据文件备份与恢复
查看>>
数据库索引介绍及使用
查看>>
MongoDB数据库插入、更新和删除操作详解
查看>>
MongoDB文档(Document)全局唯一ID的设计思路
查看>>
mongoDB简介
查看>>
Redis持久化存储(AOF与RDB两种模式)
查看>>
memcached工作原理与优化建议
查看>>
Redis与Memcached的区别
查看>>
redis sharding方案
查看>>
程序员最核心的竞争力是什么?
查看>>