oracle11中的char_function

lff1530983327發表於2014-12-23

 

真是受不了字元函式的折磨了, l_Str := Trim(Rtrim(Replace(Replace(p_Str, ';', ','), ' ', ''), ','))   LV_TEMP := SUBSTR(LV_STR, 0, INSTR(LV_STR, FV_SPLITER) - 1)

SUBSTR(LV_STR, INSTR(LV_STR, FV_SPLITER) + 1,

                       LENGTH(LV_STR));每次看到像這樣幾個字元函式一起來襲,然後我就暈了!所以我要把它詳詳細細的記下來!

就平時接觸的字符集函式來說,我用到最多的應該是substr了,所以從它說起吧!

1.SUBSTR

substr(string,start_position,subtract_length)

select   substr('56@7325@1400@',1,3) from dual;-------56@

可以看出來substr只是單純的實現從第幾位開始擷取,然後擷取幾位。

select regexp_substr('56@7325@1400@','[[:alnum:]]+',1,2) from dual;-----------7325

 regexp_substr('56@7325@1400@','[[:alnum:]]+',1,2) 各引數意義:源字符集,匹配的字符集,開始匹配的位置,第幾次匹配,__modifier   :模式('i'不區分大小寫進行檢索;'c'區分大小寫進行檢索。預設為'c'。)

regexp_substr則是傳說中的正則分割,可以實現將匹配的字元與前匹配字元之間的字元擷取出來。

2.INSTR

select   instr('56@7325@1400@',0,1,2) from dual;------12

各引數意義:源字符集,匹配的字符集,開始匹配的位置,第幾次匹配,結果為該匹配的字元所在的位置號

select  regexp_instr('56@7325@1400@','[[:digit:]]+',1,3) from dual;------4

各引數意義:源字符集,匹配的字符集,開始匹配的位置,第幾次匹配,結果為該匹配的字元所在的位置號(還有return_option以及match_parameter等引數,一般預設)

REGEXP_INSTR實現的功能與INSTR類似,不同的是REGEXP_INSTR用一個匹配模式代替了具體的字串,這樣就提供了更大的靈活性。

順帶感受一下正規表示式的威力:

select regexp_substr('56@7325@1400@1','[[:digit:]]$',1,2) from dual;-----------NULL

select regexp_substr('56@7325@1400@1','[[:digit:]]',1,2) from dual;------------6

select regexp_substr('56@7325@1400@1','[[:digit:]]+',1,2) from dual;-----------7325

select regexp_instr('56@7325@1400@1','[[:digit:]]$',1,1) from dual;-----------14

select regexp_instr('56@7325@1400@1','[[:digit:]]',1,3) from dual;------------4

select regexp_instr('56@7325@1400@1','[[:digit:]]+',1,2) from dual;-----------1,2,3,4對應的分別是1,4,9,14

[[:alnum:]]+ 表示一個或多個字元

[[:alnum:]]* 表示匹配0個或者多個字母或數字字元

[[:digit:]]+$ 表示匹配1個或者多個數字結尾的字元

.^代表開始,*表示出現0次或多次,+表示出現1次或多次,[:digit:]代表0-9的純數字(還有$代表以什麼結尾,如果是[[:digit:]]+$代表以數字結尾)。

3.REPLACE

select replace ('56@7325@1400@1','@',1)from dual;-----56173251140011

select regexp_replace ('56@7325@1400@1','[^[:alnum:]]',1)from dual;-----56173251140011

select regexp_replace ('56@7325@1400@1','[[:punct:]]',1)from dual;-----56173251140011

select regexp_replace ('56@7325@1400@1','[[:digit:]]',1)from dual;-----11@1111@1111@1

select regexp_replace ('56@7325@1400@1','[[:alnum:]]+',1)from dual;-----1@1@1@1

select regexp_replace ('56@7325@1400@1','[[:alnum:]]*',1)from dual;-----11@11@11@11

[[:alpha:]] 任何字母。

[[:digit:]] 任何數字。

[[:alnum:]] 任何字母和數字。

[[:space:]] 任何白字元。

[[:upper:]] 任何大寫字母。

[[:lower:]] 任何小寫字母。

[[:punct:]] 任何標點符號。

[[:xdigit:]] 任何16進位制的數字,相當於[0-9a-fA-F]

4.TRIM

select LENGTH(trim (trailing from ' 123    '))  from dual;----4

select LENGTH(trim (leading from  ' 123    ')) from dual;---7

使用TRAILING引數可以完成字串尾部空格的刪除功能;而LEADING引數正好相反,完成字串頭部空格的刪除功能。

select ltrim ('xxxx123xxx','x')from dual;-------123xxx

SELECT RTRIM('45123321HELLO===321', '123') FROM DUAL;-----45123321HELLO===

SELECT LTRIM('123321HELLO===', '123') FROM DUAL;-----HELLO===

5.LPAD

SELECT LPAD('xxxx123xxx',10,'*************')FROM DUAL;-----**********xxxx123xxx

SELECT LPAD('xxxx123xxx',6,'*************')FROM DUAL;------xxxx12

引數意義:源字符集,要返回的長度,被填充進去的字元

最後吼吼:l_Str := Trim(Rtrim(Replace(Replace(p_Str, ';', ','), ' ', ''), ',')) 所以這段字串的意思就是:去掉p_str中的空格,然後將分號改成逗號,然後從右邊擷取左右的空格之後再做處理!呼呼。。。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30018455/viewspace-1377382/,如需轉載,請註明出處,否則將追究法律責任。

相關文章