Oracle資料庫實用函數

來源:互聯網
上載者:User

實用函數

DECODE

文法如下:  

DECODE(value, if1, then1, if2,then2,if3,then3, . . . else )  Value 代表某個表的任何類型的任意列或一個通過計算所得的任何結果。當每個value值被測試,如果value的值為if1,Decode 函數的結果是then1;如果value等於if2,Decode函數結果是then2;等等。事實上,可以給出多個if/then 配對。如果value結果不等於給出的任何配對時,Decode 結果就返回else 。  需要注意的是,這裡的if、then及else 都可以是函數或計算運算式。

執行個體

decode(tr.PERIOD_NUM,1,'P01',2,'P02',3,'P03','Err')

 

INSTR

返回要尋找字元的位置

 

CASEWHEN

詳見http://www.cnblogs.com/eshizhan/archive/2012/04/06/2435493.html

--簡單Case函數 

CASE sex 

WHEN '1' THEN '男' 

WHEN '2' THEN '女' 

ELSE '其他' END 

--Case搜尋函數 

CASE

WHEN sex = '1' THEN '男' 

WHEN sex = '2' THEN '女' 

ELSE '其他' END

 

decode和case when區別?

decode只能做等值的,case when可以做區間的,使用範圍來進行條件區分,decode能做到的,case when也能做到;效率方面,個人覺得兩者效率差不多;但decode的文法要簡單些,但它只能做等值的比較;case when end 能做條件的判斷。

http://blog.sina.com.cn/s/blog_6da521f90100tcm4.html

 

SUBSTR

substr() 函數返回字串的一部分。

文法:substr(string,start,length)

string - 指定的要截取的字串。

start - 必需,規定在字串的何處開始。

正數 - 在字串的指定位置開始

負數 - 在從字串結尾的指定位置開始

0 - 在字串中的第一個字元處開始

length - 可選,指定要截取的字串長度,預設時返回字元運算式的值結束前的全部字元。

例如:select substr('abcdefg',3,4) from dual;結果是cdef

select substr('abcdefg',-3,4) from dual;結果efg

 

OracleRegex函數:

regexp_like、regexp_substr、regexp_instr、regexp_replace

 

REPLACE

replace(x,y,z)返回值為將串X中的Y串用Z串替換後的結果字串。若省略Z參數,則將串X中為Y串的地方刪除

SELECT REPLACE('JACK and JUE','J','BL')  "Changes"  FROM DUAL;

Changes

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

BLACK and BLUE 

例子

有一個列匯入的資料應該時‘2011-10-11’的格式,結果匯入的資料為‘2011/10/11’格式的,5000多條記錄要一條條改基本不可能。 後來想到了replace這個函數,具體用法如下:

update 表1  t  set  t.列1=replace((select 列1 from 表1  a where a.主鍵列=t.主鍵列) ,'/' , '-' )  解決了我們問題。

replace 函數用法如下:

replace('將要更改的字串','被替換掉的字串','替換字串')

 

select"PARENTNAME", "MEMBERNAME", "ALIAS"

  from (select'Product' parentname,

               'ProductTotal' membername,

               '產品彙總'alias

          from dual)

 

CONNECT BY

Oracle “CONNECT BY”是層次查詢子句,一般用於樹狀或者層次結果集的查詢。其文法是:

[ START WITH condition ]

 

CONNECTBY [ NOCYCLE ] condition

1.  可用來產生序列

SELECT ROWNUM FROM DUAL CONNECT BY ROWNUM<= 10;

2.可用來實現樹狀查詢

CONNECT BY rownum <= length(p_str))對輸入的字串進行逐個遍曆

selectrownumfrom dualCONNECTBYrownum <=length('qwertyui')

 

詳見http://www.cnblogs.com/lettoo/archive/2010/08/03/1791239.html

 

RPAD

rpad函數從右邊對字串使用指定的字元進行填充   rpad(string,padded_length,[pad_string])  

string 表示:被填充的字串   

padded_length 表示:字元的長度,是返回的字串的數量,如果這個數量比原字串的長度要短,rpad函數將會把字串截取成從左至右的n個字元;   

pad_string 是個選擇性參數,這個字串是要粘貼到string的右邊,如果這個參數未寫,lpad函數將會在string的右邊粘貼空格。   

例如:  

rpad('tech', 7); 將返回'tech '   

rpad('tech', 2); 將返回'te'   

rpad('tech', 8, '0'); 將返回'tech0000'  

rpad('tech on the net', 15, 'z'); 將返回 'tech onthe net'   

rpad('tech on the net', 16, 'z'); 將返回 'tech onthe netz'

 

TRUNC

TRUNC函數返回以指定元素格式截去一部分的日期值。

--Oracle trunc()函數的用法
/**************日期********************/
1.select trunc(sysdate) from dual  --2011-3-18 今天的日期為2011-3-18
2.select trunc(sysdate, 'mm')   from  dual  --2011-3-1   返回當月第一天.
3.select trunc(sysdate,'yy') from dual --2011-1-1      返回當年第一天
4.select trunc(sysdate,'dd') from dual --2011-3-18   返回當前年月日
5.select trunc(sysdate,'yyyy') from dual --2011-1-1  返回當年第一天
6.select trunc(sysdate,'d') from dual --2011-3-13 (星期天)返回當前星期的第一天
7.select trunc(sysdate, 'hh') from dual   --2011-3-18 14:00:00  目前時間為14:41  
8.select trunc(sysdate, 'mi') from dual  --2011-3-18 14:41:00   TRUNC()函數沒有秒的精確
/***************數字********************/
/*
TRUNC(number,num_digits)
Number 需要截尾取整的數字。
Num_digits 用於指定取整精度的數字。Num_digits的預設值為 0。
TRUNC()函數截取時不進行四捨五入
*/
9.select trunc(123.458) from dual--123
10.select trunc(123.458,0) from dual--123
11.select trunc(123.458,1) from dual --123.4
12.select trunc(123.458,-1) from dual--120
13.select trunc(123.458,-4) from dual--0
14.select trunc(123.458,4) from dual --123.458
15.select trunc(123) from dual --123
16.select trunc(123,1) from dual--123
17.select trunc(123,-1) from dual--120

 

一下語句會經常用到,相當於不用建立表而可以插入幾條資料

Select ‘Jan’ membername,’1月’ name from dual union select ‘Feb’ membername,’2月’ name from dual;

 

ADD_MONTHS

ADD_MONTHS(d,n)--時間點d再加上n個月

 

有兩個簡單例子,以說明"exists"和"in"的效率問題

1) select * from T1 where exists(select 1from T2 where T1.a=T2.a) ;

  T1資料量小而T2資料量非常大時,T1<<T2 時,1) 的查詢效率高。

2) select * from T1 where T1.a in (selectT2.a from T2) ;

T1資料量非常大而T2資料量小時,T1>>T2時,2) 的查詢效率高。

 

In適合內外表都很大的情況,exists適合外表結果集很小的情況

 

過使用EXISTS,Oracle會首先檢查主查詢,然後運行子查詢直到它找到第一個匹配項,這就節省了時間。

Oracle在執行IN子查詢時,首先執行子查詢,並將獲得的結果清單存放在一個加了索引的暫存資料表中。

在執行子查詢之前,系統先將主查詢掛起,待子查詢執行完畢,存放在暫存資料表中以後再執行主查詢。

這也就是使用EXISTS比使用IN通常查詢速度快的原因。

 

OVER函數的作用及用法

RANK ( ) OVER ( [query_partition_clause]order_by_clause )

DENSE_RANK ( ) OVER ([query_partition_clause] order_by_clause )

可實現按指定的欄位分組排序,對於相同分組欄位的結果集進行排序,

其中PARTITION BY 為分組欄位,ORDER BY 指定排序欄位。

 

over不能單獨使用,要和分析函數:rank(),dense_rank(),row_number()等一起使用。
其參數:over(partition by columnname1 order by columnname2)
含義:按columname1指定的欄位進行分組排序,或者說按欄位columnname1的值進行分組排序。
例如:employees表中,有兩個部門的記錄:department_id =10和20
select department_id,rank() over(partition by department_idorder by salary) from employees就是指在部門10中進行薪水的排名,在部門20中進行薪水排名。如果是partition by org_id,則是在整個公司內進行排名。

 

TO_CHAR TO_DATE

to_char和to_date經驗分享

㈠比較下面兩種寫法:

to_char(start_time,'yyyy-mm-ddhh24:mi:ss')='2013-06-06 16:18:30'

start_time=to_date('2013-06-06 16:18:30','yyyy-mm-ddhh24:mi:ss')

任何時候都推薦使用後者!!

㈡數字轉為英文的簡單實現

sys@ORCL> selectto_char(to_date('1314','J'),'Jsp') as "I love 1314" from dual; 

I love 1314 

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

One Thousand Three Hundred Fourteen 

TO_CHAR(aDate,'JSP')可以得到一個數位拼字,例如:
SELECT TO_CHAR(SYSDATE, 'JSP') FROM DUAL;
這條SQL的查詢結果是:
TWO MILLION FOUR HUNDRED FIFTY-THREE THOUSAND FIVE HUNDRED NINE
該數字為:20004530509
為什麼?
因為TO_CHAR(aDate,'JSP')是指日期aDate距離JULIAN日期的第一天即4712-01-01BC的天數,也就是從公元前4712年的1月1號到aDate這個日期的天數的英文拼字.Cool!
JULIAN日期的範圍是公元前4712-01-01到公元9999-01-01.期間的天數是我們能夠拼字的最大值,最小值是1.
那麼我們要想得到對一個數位拼字,只要知道這些天數之後的那個日期就行,得到這個日期很簡單:
TO_DATE(aDigital,'J') 其中aDigital就是你要表示的數字.
這樣我們得到一個數位拼字可以這樣(例如101):
SELECT TO_CHAR(TO_DATE(101, 'J'), 'JSP') FROM dual
得到的結果是: ONE HUNDRED ONE

㈢一個 to_date 的陷阱

我們可以用to_date函數來構造自己想要的任何時間

當省略了HH,MI,SS時,oracle預設置為0,即:取整到日

當省略了DD時,oracle預設置為1,即:取整到月

當省略了MM時,oracle會取整到年嗎?我們都會慣性的認為:會。然,非也!

Oracle不會取整到年,他會取整到當前月!

select to_date('1991','yyyy')from dual;

結果為1991-6-1

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.