亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

參數(shù)返回Oracle 常用函數(shù):nvl/nullif/case when

系統(tǒng) 2280 0

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

???? 1.nvl函數(shù)

???? ? ? nvl函數(shù)將一個null值轉(zhuǎn)換為一個實際的值,數(shù)據(jù)類型可所以日期,數(shù)字,字符,數(shù)據(jù)類型必須匹配:如:
? ? ? ? nvl(commision,0)

???? ? ? ? ? nvl(hiredate,'01-JAN-87')

???? ? ? ? ? nvl(job_id,'no manager')

???? ? ? ? ? nvl(to_char(job_id),'no manager')

???? ? ? nvl可以轉(zhuǎn)換任何數(shù)據(jù)類型,但是轉(zhuǎn)換的數(shù)據(jù)類型返回值必須是nvl(expr1,expr2)第一個參數(shù)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的值通過查詢?nèi)〉媚硞€字段的總計值,如果這個值位null將給出一個預(yù)設(shè)的默許值

???? 返回值類型 :
字符型、日期型、日期時間型、數(shù)值型、貨幣型、邏輯型或 null 值?
說明:
在不支持 null 值或 null 值可有可無的情況下,可以使用 NVL( ) 來移去盤算或操縱中的 null 值. select nvl(a.name,'空值') as name from student a join school b on a.ID=b.ID 注意:兩個參數(shù)得類型要匹配 問:什么是NULL? 答:在我們不知道具體有什么數(shù)據(jù)的時候,也即未知,可以用NULL, 我們稱它為空,ORACLE中,含有空值的表列長度為零。
ORACLE答應(yīng)任何一種數(shù)據(jù)類型的字段為空,除了以下兩種情況:

???? 1)主鍵字段(primary key),

???? 2)定義時已經(jīng)加了NOT NULL限制條件的字段

???? 說明:

???? (1)等價于沒有任何值、是未知數(shù)。

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

???? (3)對空值做加、減、乘、除等運算操縱,結(jié)果仍為空。

???? (4)NULL的處理使用NVL函數(shù)。

???? (5)比較時使用關(guān)鍵字用“is null”和“is not null”。

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

???? (7)排序時比其他數(shù)據(jù)都大(索引默許是降序排列,小→大), 所以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?
對空值做加、減、乘、除等運算操縱,結(jié)果仍為空。?
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 設(shè)置某些列為空值 update table1 set 列1=NULL where 列1 is not null;?
現(xiàn)有一個商品銷售表sale,表結(jié)構(gòu)為:?

???? 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記載. 結(jié)果說明:查詢結(jié)果說明此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的空值就是這么的用法,我們最好熟悉它的約定,以防查出的結(jié)果不正確

???? 2.nvl2函數(shù)

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

???? ? ? 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 函數(shù)
? ? nullif(expre1,expre2) 比較兩個參數(shù),如果參數(shù)1和參數(shù)2相等,返回null.如果不相等,返回第一個參數(shù),你可以為第一個參數(shù)指定空字符。

???? ? ? 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的結(jié)果返回為null,這里的nullif與case表達(dá)式差不多

???? 4.coalesce函數(shù)

???? ? ?? coalesce(expre1,expre2,expre3)

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

???? ? ? 例子:
? ? 顯示雇員名字,如果獎金不為null,返回comm,如果comm為null,那么返回參數(shù)2,如果參數(shù)1和參數(shù)2都為null,那么返回數(shù)字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.條件表達(dá)式: case when 函數(shù)

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

???? ? ? 在所有表達(dá)式中:expre,comparison_expre,return_expre 這三個表達(dá)式數(shù)據(jù)類型要一樣,可以使用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函數(shù)

???? ? ? DECODE(col|expression ,search1,result1[,search2,result2][,default]).如果default值被省略了,那么當(dāng)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函數(shù)

????

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

????

準(zhǔn)備測試數(shù)據(jù)

????

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 : 轉(zhuǎn)

????

SQL> select wm_concat( name ) from test;

????

WM_CONCAT( NAME )

????

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

????

a,b,c,d,e

????


????

效果2: 把結(jié)果里的逗號替換成 "|"

????

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多個字段,要是靠手工寫太麻煩了,有沒有什么輕便的方法? 當(dāng)然有了,看我如果應(yīng)用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

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

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 福利入口在线观看 | 日韩在线一区二区三区 | 九九热在线视频 | 久久99精品国产麻豆不卡 | 国产综合成人久久大片91 | 国产精品视频在线免费观看 | 中文字幕影院 | 欧美成人四级剧情在线播放 | 久久三级视频 | 日本亚洲国产精品久久 | jiz中国| 久久久青青久久国产精品 | 成年香蕉大黄美女美女 | 毛片小视频 | h片在线播放免费高清 | 精品国产你懂的在线观看 | 久久久久青草大香线综合精品 | 青草免费免费观看视频在线 | 一级毛片成人午夜 | 真人毛片免费拍拍拍aa视频 | 亚洲成a人片在线观看www | 九九热免费 | 老司机午夜免费影院 | 国产精品免费视频一区二区三区 | 成人国产精品999视频 | 国产精品视_精品国产免费 国产精品视频2021 | 欧美日韩一区二区三在线 | 四虎影视永久免费观看地址 | 在线播放人成午夜免费视频 | 精品一精品国产一级毛片 | 国产成人综合91香蕉 | 日本不卡免费一区 | 久久人人爽人人爽人人片av不 | 亚洲欧美久久精品一区 | 久久国产热视频 | 成人18毛片| 毛片网络| 亚洲精品高清在线一区二区三区 | 老司机激情影院 | a免费毛片在线播放 | 白蛇缘起3免费观看 |