-- 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;
-- 更多參見:Oracle SQL 精萃
-- 聲明:轉載請註明出處
-- Last Edited on 2015-06-19
-- Created by ShangBo on 2014-12-18
-- End