【轉】oracle nvl函數


1.nul函數將一個null值轉換為一個實際的值。
數據類型可以是日期,數字,字符。
數據類型必須匹配:
   nvl(commision,0)
   nvl(hiredate,'01-JAN-87')
   nvl(job_id,'no manager') nvl(to_char(job_id),'no manager')

nvl能夠轉換任何數據類型,但是轉換的數據類型返回值必須是nvl(expr1,expr2)第一個參數expr的類型。如:date,number, varchar2 or char

例子:計算員工的年薪,獎金為空的用0代替。

SQL> select empno,ename,sal,nvl(comm,0) comm, (sal+nvl(comm,0))*12 annual_sal fr
om emp ;

     EMPNO ENAME             SAL       COMM ANNUAL_SAL
---------- ---------- ---------- ---------- ----------
      7369 SMITH             800          0       9600
      7499 ALLEN            1600        300      22800
      7521 WARD             1250        500      21000
      7566 JONES            2975          0      35700
      7654 MARTIN           1250       1400      31800
      7698 BLAKE            2850          0      34200
      7782 CLARK            2450          0      29400
      7788 SCOTT            3000          0      36000
      7839 KING             5000          0      60000
      7844 TURNER           1500          0      18000
      7876 ADAMS            1100          0      13200

     EMPNO ENAME             SAL       COMM ANNUAL_SAL
---------- ---------- ---------- ---------- ----------
      7900 JAMES             950          0      11400
      7902 FORD             3000          0      36000
      7934 MILLER           1300          0      15600

已選擇14行。

 


2.使用nvl2函數。

nvl2(expre1,expre2,expre3)函數
如果第一個參數不為空,那么返回第二個參數,如果為空,返回第三個參數。
參數1可以是任何數據類型。參數2和參數3也可以是任何數據類型,除了long類型之外。
如果后兩個參數數據類型不一樣,數據庫將會把第三個參數的數據類型轉換為第二個參數的數據類型。

SQL> select ename,sal,comm,nvl2(comm,'sal+comm','sal') income from emp;

ENAME             SAL       COMM INCOME
---------- ---------- ---------- --------
SMITH             800            sal
ALLEN            1600        300 sal+comm
WARD             1250        500 sal+comm
JONES            2975            sal
MARTIN           1250       1400 sal+comm
BLAKE            2850            sal
CLARK            2450            sal
SCOTT            3000            sal
KING             5000            sal
TURNER           1500          0 sal+comm
ADAMS            1100            sal

ENAME             SAL       COMM INCOME
---------- ---------- ---------- --------
JAMES             950            sal
FORD             3000            sal
MILLER           1300            sal

已選擇14行。

3.nullif 函數的使用:
nullif(expre1,expre2) 比較兩個參數,如果參數1和參數2相等,返回null.
如果不相等,返回第一個參數。你能夠為第一個參數指定空字符。

SQL> SELECT ENAME,SAL,COMM,NULLIF(SAL,COMM)RESULTS FROM EMP;

ENAME             SAL       COMM    RESULTS
---------- ---------- ---------- ----------
SMITH             800        800
ALLEN            1600        300       1600
WARD             1250        500       1250

這里的Smith的結果返回為null。
這里的nullif與case表達式差不多。

4.使用coalesce函數

coalesce(expre1,expre2,expre3)

參數1:如果第一參數不為空,返回第一個參數。
參數2:如果參數1為空,則返回第二個參數。
參數3:如果參數1和參賽2都為空,返回第三個參數。

例子:
顯示雇員名字,如果獎金不為null,返回comm;如果comm為sal,那么返回參數2;
如果參數1和參數2都為null,那么返回數字10.

SQL> select ename,coalesce(comm,sal,10) income from emp;

ENAME          INCOME
---------- ----------
SMITH             800
ALLEN             300
WARD              500
JONES            2975
MARTIN           1400
BLAKE            2850
CLARK            2450
SCOTT            3000
KING             5000
TURNER              0
ADAMS            1100

 

5.條件表達式

if-else-then ,case , decode

(1) case when 函數

case expre when comparison_expre1 then return_expre1
                [when comparison_expre2 then return_expre2
   when comparison_expre3 then return_expre3
   else else_expres]
   end

在所有表達式中:expre,comparison_expre,return_expre 這三個表達式數據類型要一樣。
能夠使varchar,varchar2,char,nchar or nvarchar2.

例子:

SQL> SELECT ENAME,SAL,JOB,
  2         CASE JOB WHEN 'MANAGER' THEN SAL+100
  3                  WHEN 'ANALYSIS' THEN SAL+200
  4                  WHEN 'SALESMAN' THEN SAL+300
  5                  ELSE SAL+400
                     END "RESULTS"
  6  FROM EMP;

ENAME             SAL JOB          RESULTS
---------- ---------- --------- ----------
SMITH             800 CLERK           1200
ALLEN            1600 SALESMAN        1900
WARD             1250 SALESMAN        1550
JONES            2975 MANAGER         3075
MARTIN           1250 SALESMAN        1550

6.DECODE函數的使用

DECODE(col|expression ,search1,result1
   [,search2,result2]
   [,default])
如果default值被省略了,那么當search值沒有與任何的math值匹配,將返回null值。

 

SQL> SELECT ENAME,JOB,SAL,
  2     DECODE(JOB,'MANAGER',SAL+100,
  3                'SALESMAN',SAL+200,
  4             SAL) REVISED_SAL
  5  FROM EMP;

ENAME      JOB              SAL REVISED_SAL
---------- --------- ---------- -----------
SMITH      CLERK            800         800
ALLEN      SALESMAN        1600        1800
WARD       SALESMAN        1250        1450
JONES      MANAGER         2975        3075
MARTIN     SALESMAN        1250        1450
BLAKE      MANAGER         2850        2950
CLARK      MANAGER         2450        2550


例子2:
計算出30部門的各個員工的個人所得稅稅率
  1  SELECT ENAME,SAL,
  2  DECODE(TRUNC(SAL/1000,0),0,0.00,
  3                          1,0.09,
  4                          2,2.0,
  5                          3.0) TAX_RATE
  6  FROM EMP
  7* WHERE DEPTNO=30
SQL> /

ENAME             SAL   TAX_RATE
---------- ---------- ----------
ALLEN            1600        .09
WARD             1250        .09
MARTIN           1250        .09
BLAKE            2850          2
TURNER           1500        .09
JAMES             950          0

已選擇6行。

 

更新:

【轉】oracle中nvl()函數

oracle的nvl函數的用法

通過查詢獲得某個字段的合計值,如果這個值位null將給出一個預設的默認值 
select nvl(sum(t.dwxhl),1) from tb_jhde t where zydm=-1
這里關心的nvl的用法,nvl(arg,value)代表如果前面的arg的值為null那么返回的值為后面的value 
如: NVL(a,b)就是判斷a是否是NULL,如果不是返回a的值,如果是返回b的值 通過查詢獲得某個字段的合計值,如果這個值位null將給出一個預設的默認值

另一個有關的有用方法 
declare 
i integer 
select nvl(sum(t.dwxhl),1) into i from tb_jhde t where zydm=-1
這樣就可以把獲得的合計值存儲到變量i中,如果查詢的值為null就把它的值設置為默認的1

Oracle下Nvl函數 nvl( ) 函數 從兩個表達式返回一個非 null 值。 
語法 
NVL(eExpression1, eExpression2) 
參數 
eExpression1, eExpression2 
如 果 eExpression1 的計算結果為 null 值,則 NVL( ) 返回 eExpression2。如果 eExpression1 的計算結果不是 null 值,則返回 eExpression1。eExpression1 和 eExpression2 可以是任意一種數據類型。如果 eExpression1 與 eExpression2 的結果皆為 null 值,則 NVL( ) 返回 .NULL.。 
返回值類型 
字符型、日期型、日期時間型、數值型、貨幣型、邏輯型或 null 值 
說明 
在不支持 null 值或 null 值無關緊要的情況下,可以使用 NVL( ) 來移去計算或操作中的 null 值。 select nvl(a.name,'空得') as name from student a join school b on a.ID=b.ID 注意:兩個參數得類型要匹配 問:什么是NULL? 答:在我們不知道具體有什么數據的時候,也即未知,可以用NULL, 我們稱它為空,ORACLE中,含有空值的表列長度為零。
ORACLE允許任何一種數據類型的字段為空,除了以下兩種情況:

1、主鍵字段(primary key),

2、定義時已經加了NOT NULL限制條件的字段

說明:

1、等價於沒有任何值、是未知數。

2、NULL與0、空字符串、空格都不同。

3、對空值做加、減、乘、除等運算操作,結果仍為空。

4、NULL的處理使用NVL函數。

5、比較時使用關鍵字用“is null”和“is not null”。

6、空值不能被索引,所以查詢時有些符合條件的數據可能查不出來, count(*)中,用nvl(列名,0)處理后再查。

7、排序時比其他數據都大(索引默認是降序排列,小→大), 所以NULL值總是排在最后。
使用方法: 
SQL> select 1 from dual where null=null; 沒有查到記錄 
SQL> select 1 from dual where null=''; 沒有查到記錄 
SQL> select 1 from dual where ''=''; 沒有查到記錄 
SQL> select 1 from dual where null is null; 1 --------- 1 
SQL> select 1 from dual where nvl(null,0)=nvl(null,0); 1 --------- 1 
對空值做加、減、乘、除等運算操作,結果仍為空。 
SQL> select 1+null from dual; 
SQL> select 1-null from dual; 
SQL> select 1*null from dual; 
SQL> select 1/null from dual; 查詢到一個記錄. 注:這個記錄就是SQL語句中的那個null 設置某些列為空值 update table1 set 列1=NULL where 列1 is not null; 
現有一個商品銷售表sale,表結構為: month  char(6)  --月份 sellnumber(10,2) --月銷售金額 create table sale (month char(6),sell number); insert into sale values('200001',1000); insert into sale values('200002',1100); insert into sale values('200003',1200); insert into sale values('200004',1300); insert into sale values('200005',1400); insert into sale values('200006',1500); insert into sale values('200007',1600); insert into sale values('200101',1100); insert into sale values('200202',1200); insert into sale values('200301',1300); insert into sale values('200008',1000); insert into sale(month) values('200009'); (注意:這條記錄的sell值為空) 
commit; 共輸入12條記錄
SQL> select * from sale where sell like '%'; 
MONTH SELL ------ --------- 200001 1000 200002 1100 200003 1200 200004 1300 200005 1400 200006 1500 200007 1600 200101 1100 200202 1200 200301 1300 200008 1000
查詢到11記錄. 結果說明: 查詢結果說明此SQL語句查詢不出列值為NULL的字段 此時需對字段為NULL的情況另外處理。 
SQL> select * from sale where sell like '%' or sell is null; 
SQL> select * from sale where nvl(sell,0) like '%'; 
MONTH SELL ------ --------- 200001 1000 200002 1100 200003 1200 200004 1300 200005 1400 200006 1500 200007 1600 200101 1100 200202 1200 200301 1300 200008 1000 200009 查詢到12記錄. Oracle的空值就是這么的用法,我們最好熟悉它的約定,以防查出的結果不正確

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM