日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

參數返回Oracle 常用函數:nvl/nullif/case when

系統 2447 0

今天一直在研究參數返回之類的問題,上午正好有機會和大家討論一下.

???? 1.nvl函數

???? ? ? nvl函數將一個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 from 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

???? ? ? nvl(arg,value)代表如果后面的arg的值為null那么返回的值為后面的value? 如: NVL(a,b)就是判斷a是否是NULL,如果不是返回a的值,如果是返回b的值通過查詢取得某個字段的總計值,如果這個值位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);?

???? i nsert into sale(month) values('200009'); (注意:這條記載的sell值為空)?

???? commit; 共輸入4條記載
SQL> select * from sale where sell like '%';?
MONTH SELL?

???? ------ ---------?

???? 200001 1000?

???? 200002 1100?

???? 200003 1200?

???? 查詢到3記載. 結果說明:查詢結果說明此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?

???? 200009?

???? 查詢到4記載. Oracle的空值就是這么的用法,我們最好熟悉它的約定,以防查出的結果不正確

???? 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

???? 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為null,那么返回參數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
? ? SCOTT??????????? 3000
? ? KING???????????? 5000
? ? TURNER????????????? 0
? ?ADAMS??????????? 1100

???? 5.條件表達式: 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,

???? ? ? CASE JOB WHEN 'MANAGER' THEN SAL+100
? ? WHEN 'ANALYSIS' THEN SAL+200
? ? WHEN 'SALESMAN' THEN SAL+300
? ? ELSE SAL+400
? ? END "RESULTS"
? ? 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,DECODE(JOB,'MANAGER',SAL+100,?'SALESMAN',SAL+200,SAL) REVISED_SAL ? ? ? 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部門的各個員工的個人所得稅稅率
? ? SELECT ENAME,SAL,DECODE(TRUNC(SAL/1000,0),0,0.00,1,0.09,2,2.0,3.0) TAX_RATE?

???? ? ? FROM EMP?WHERE DEPTNO=30

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

???? 7.wm_concat函數

????

函數wm_concat(列名)可以把列值以 "," 號分隔起來,并顯示成一行

????

準備測試數據

????

SQL> create table test(id number, name varchar2(20));

????

SQL> insert into test values (1, 'a' );

????

SQL> insert into test values (1, 'b' );

????

SQL> insert into test values (1, 'c' );

????

SQL> insert into test values (2, 'd' );

????

SQL> insert into test values (2, 'e' );

????

SQL> commit ;

????


????每日一道理
書,各種各樣的書。書,寄托著人類熱切的希望;書,蘊含著人類豐富的感悟。提起書,會有說不完的話語……

????

效果1 :

????

SQL> select wm_concat( name ) from test;

????

WM_CONCAT( NAME )

????

------------------------------

????

a,b,c,d,e

????


????

效果2: 把結果里的逗號替換成 "|"

????

SQL> select replace (wm_concat( name ), ',' , '|' ) from test;

????

REPLACE (WM_CONCAT( NAME ), ',' , '|' )

????

-----------------------------------------------------------------------

????

a|b|c|d|e

????


????

效果3:按ID分組合并 name

????

SQL> select id,wm_concat( name ) name from test group by id;

????

ID NAME

????

---------- ------------------------------

????

1 a,b,c

????

2 d,e

????

案例:我要寫一個視圖,相似 "create or replace view as select 字段1,...字段50 from tablename" ,基表有50多個字段,要是靠手工寫太麻煩了,有沒有什么輕便的方法? 當然有了,看我如果應用wm_concat來讓這個需求變簡略

????

SQL> select 'create or replace view as select ' || wm_concat(column_name) || ' from dept' from user_tab_columns where table_name= 'DEPT' ;

????


????

'CREATEORREPLACEVIEWASSELECT' ||WM_CONCAT(COLUMN_NAME)|| 'FROMDEPT'

????

--------------------------------------------------------------------------------

????

create or replace view as select DEPTNO,DNAME,LOC from dept

文章結束給大家分享下程序員的一些笑話語錄: 祝大家在以后的日子里. 男生象Oracle般健壯; 女生象win7般漂亮; 桃花運象IE中毒般頻繁; 錢包如Gmail容量般壯大, 升職速度趕上微軟打補丁 , 追女朋友像木馬一樣猖獗, 生活像重裝電腦后一樣幸福, 寫程序敲代碼和聊天一樣有**。

參數返回Oracle 常用函數:nvl/nullif/case when/wm_concat/replace


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 长顺县| 思南县| 山阳县| 怀仁县| 沾化县| 高平市| 安国市| 淮阳县| 久治县| 根河市| 望江县| 鹤庆县| 宜兴市| 宁波市| 洞头县| 辽宁省| 岳西县| 沽源县| 宣威市| 宁陵县| 九龙坡区| 伊川县| 奈曼旗| 邵阳县| 鱼台县| 金坛市| 麻城市| 错那县| 乡宁县| 揭东县| 塔河县| 安多县| 新巴尔虎左旗| 县级市| 伊金霍洛旗| 武汉市| 兴隆县| 武强县| 桑植县| 新化县| 阳信县|