1、decode(exp,s1,r1,s2,r2..s,r[,def]) 可以把它理解成乙個增強型的if else,只不過它並不通過多行語句,而是在乙個函式內實現if else的功能。
exp做為初始引數。s做為對比值,相同則返回r,如果s有多個,則持續遍歷所有s,直到某個條件為真為止,否則返回預設值def(如果指定了的話),如果沒有預設值,並且前面的對比也都沒有為真,則返回空。
毫無疑問,decode是個非常重要的函式,在實現行轉列等功能時都會用到,需要牢記和熟練使用。
例如:select decode('a2','a1','true1','a2','true2','default') from dual;
2、greatest(n1,n2,...n) 返回序列中的最大值
例如:select greatest(15,5,75,8) "greatest" from dual;
3、least(n1,n2....n) 返回序列中的最小值
例如:select least(15,5,75,8) least from dual;
4、nullif(c1,c2)
nullif也是個很有意思的函式。邏輯等價於:case when c1 = c2 then null else c1 end
例如:select nullif('a','b'),nullif('a','a') from dual;
5、nvl(c1,c2) 邏輯等價於if c1 is null then c2 else c1 end。c1,c2可以是任何型別。如果兩者型別不同,則oracle會自動將c2轉換為c1的型別。
例如:select nvl(null, '12') from dual;
6、nvl2(c1,c2,c3) 大家可能都用到nvl,但你用過nvl2嗎?如果c1非空則返回c2,如果c1為空則返回c3
例如:select nvl2('a', 'b', 'c') isnull,nvl2(null, 'b', 'c') isnotnull from dual;
7、sys_connect_by_path(col,c) 該函式只能應用於樹狀查詢。返回通過c1連線的從根到節點的路徑。該函式必須與connect by 子句共同使用。
例如:create table t***(
rootcol varchar2(10),
nodecol varchar2(10)
); insert into t*** values ('','a001');
insert into t*** values ('','b001');
insert into t*** values ('a001','a002');
insert into t*** values ('a002','a004');
insert into t*** values ('a001','a003');
insert into t*** values ('a003','a005');
insert into t*** values ('a005','a008');
insert into t*** values ('b001','b003');
insert into t*** values ('b003','b005');
select lpad(' ', level*10,'=') ||'>'|| sys_connect_by_path(nodecol,'/')
from t***
start with rootcol = 'a001'
connect by prior nodecol =rootcol;
轉換函式將指定字元從一種型別轉換為另一種,通常這類函式遵循如下慣例:函式名稱後面跟著待轉換型別以及輸出型別。
1、bin_to_num(n1,n2...n) 將一組位向量轉換為等價的十進位制形式。
例如:select bin_to_num(1,1,0) from dual;
2、cast(c as newtype) 將指定字串轉換為指定型別,基本只對字元型別有效,比如char,number,date,rowid等。此類轉換有乙個專門的表列明了哪種型別可以轉換為哪種型別,此處就不作酹述。
例如:select cast('1101' as number(5)) from dual;
3、chartorowid(c) 將字串轉換為rowid型別
例如:select chartorowid('a003d1abbefaabsaa0') from dual;
4、rowidtochar(rowid) 轉換rowid值為varchar2型別。返回串長度為18個位元組。
例如:select rowidtochar(rowid) from dual;
5、to_multi_byte(c) 將指定字元轉換為全形並返回char型別字串
例如:select to_multi_byte('abc abc 中華') from dual;
6、to_single_byte(c) 將指定字元轉換為半形並返回char型別字串
例如:select to_single_byte('abc abc中華') from dual;
1、coalesce(n1,n2,....n) 返回序列中的第乙個非空值
例如:select coalesce(null,5,6,null,9) from dual;
2、dump(exp[,fmt[,start[,length]]])
dump是個功能非常強悍的函式,對於深入了解oracle儲存的人而言相當有用。所以對於我們這些僅僅只是應用的人而言就不知道能將其應用於何處了。此處僅介紹用法,不對其功能做深入分析。
如上所示,dump擁有不少引數。其本質是以指定格式,返回指定長度的exp的內部表示形式的varchar2值。fmt含4種格式:8||10||16||17,分別表示8進製,10進製,16進製制和單字元,預設為10進製。start引數表示開始位置,length表示以,分隔的字串數。
例如:select dump('abcdefg',17,2,4) from dual;
3、empty_blob,empty_clob 這兩個函式都是返回空lob型別,通常被用於insert和update等語句以初始化lob列,或者將其置為空。empty表示lob已經被初始化,只不過還沒有用來儲存資料。
4、nls_charset_name(n) 返回指定數值對應的字符集名稱。
例如:select nls_charset_name(1) from dual;
5、nls_charset_id(c) 返回指定字元對應的字符集id。
例如:select nls_charset_id('us7ascii') from dual;
6、nls_charset_decl_len(n1,n2) 返回乙個nchar值的宣告寬度(以字元為單位).n1是該值以位元組為單位的長度,n2是該值的字符集id
例如:select nls_charset_decl_len(100, nls_charset_id('us7ascii')) from dual;
4、bitand(n1,n2) 位與運算,這個太有意思了,雖然沒想到可能用到**,詳細說明一下:
假設3,9做位與運算,3的二進位制形式為:0011,9的二進位制形式為:1001,則結果是0001,轉換成10進製數為1。
例如:select bitand(3,9) from dual;
5、ceil(n) 返回大於或等於n的最小的整數值
例如:select ceil(18.2) from dual;
考你一下,猜猜ceil(-18.2)的值會是什麼呢
6、floor(n) 返回小於等於n的最大整數值
例如:select floor(2.2) from dual;
再猜猜floor(-2.2)的值會是什麼呢
7、bin_to_num(n1,n2,....n) 二進位制轉向十進位制
例如:select bin_to_num(1),bin_to_num(1,0),bin_to_num(1,1) from dual;
oracle輔助函式
oracle 輔助函式 1 decode exp,s1,r1,s2,r2.s,r def 可以把它理解成乙個增強型的if else,只不過它並不通過多行語句,而是在乙個函式內實現if else的功能。exp做為初始引數。s做為對比值,相同則返回r,如果s有多個,則持續遍歷所有s,直到某個條件為真為止...
oracle輔助函式
oracle 輔助函式 1 decode exp,s1,r1,s2,r2.s,r def 可以把它理解成乙個增強型的if else,只不過它並不通過多行語句,而是在乙個函式內實現if else的功能。exp做為初始引數。s做為對比值,相同則返回r,如果s有多個,則持續遍歷所有s,直到某個條件為真為止...
STL vector 輔助函式
template inline bool operator const vector tp,alloc x,const vector tp,alloc y 判斷相等 template inline bool operator const vector tp,alloc x,const vector ...