oracle中實現擷取字串(substr)、查詢字串位置(instr)、替換字串(replace)
(1)oracle中實現擷取字串:substr
substr(string, start_position, [length])
其中,string是元字串,start_position為開始位置,length是可選項,表示子字串的位數。
例子:
substr('ABCDEFG', 0); -- 返回結果是:ABCDEFG,從0位開始擷取後面所有
substr('ABCDEFG', 2); -- 返回結果是:BCDEFG,從2位開始擷取後面所有
substr('ABCDEFG', 0, 3); -- 返回結果是:ABC,從0位開始往後擷取3個字元長度
substr('ABCDEFG', 0, 100); -- 返回結果是:ABCDEFG,雖然100超出了元字串長度,但是系統會按元字串最大數量返回,不會影響返回結果
substr('ABCDEFG', -3); -- 返回結果是:EFG,如果是負數,則從尾部往前數,擷取-3位置往後的所有字串
(2)查詢字串位置:instr
instr(string, subString, [start_position, [nth_appearance]])
其中,string是元字串;subString是要查詢的子字串;start_position是要查詢的開始位置,為可選項(預設為1),注意在這裡字串索引從1開始,如果此引數為正,則從左到右檢索,如果此引數為負,則從右到左檢索;nth_appearance是元字串中第幾次出現的子字串,此引數可選,預設預設為1,如果是負數則系統報錯。
例子:
instr('ABCDABCDAEF', 'AB'); -- 返回結果是:1,因為instr字串索引從1開始,所以是1不是0
instr('ABCDABCDAEF', 'DA', 1, 2); -- 返回結果是:8,返回第二次出現'DA'的位置
instr('A BCDABCDAEF', 'DA', 1, 2); -- 返回結果是:9,由於我在元字串中加了一個空格,空格仍然算一個字元
(3)替換字串:replace
replace(str1, str2, str3)
其表示的意思是:在str1中查詢str2,凡是出現str2的地方,都替換成str3。
replace('ABCDEFG', 'CDE', 'cde'); -- 返回結果是:ABcdeFG
replace('ABCDEFG', 'CDE', ''); -- 返回結果是:ABFG,CDE被替換成空字元
replace('ABCDEFG', 'CDE'); -- 返回結果是:ABFG,當不存在第三個引數時,CDE直接被刪掉
使用例項:
將一張表的一列按條件擷取後存入到另一列。如下圖所示,將TAG_NAME中的內容擷取至最後一位“.”並將前面的內容存入到CHANNEL_NAME列。
sql語句:
<span style="font-size:18px;">UPDATE smartsys.fes_ana_define anadefine
SET ANADEFINE.CHANNEL_NAME =
SUBSTR (ANADEFINE.TAG_NAME,0,INSTR (ANADEFINE.TAG_NAME, '.', -1) - 1);</span>
<span style="font-size:18px;">commit;</span>
執行結果:
測試過程:
<span style="font-size:18px;">select substr(ANADEFINE.TAG_NAME,0,instr(ANADEFINE.TAG_NAME,'.',-1)-1) </span>
<span style="font-size:18px;"> from smartsys.fes_ana_define anadefine; </span>
輸出結果: