1. 程式人生 > >oracle字串載取及判斷是否包含指定字串

oracle字串載取及判斷是否包含指定字串

 

切割字串,一般是不會通過資料庫函式來處理的(大部分是查詢出結果後通過程式碼處理的),但是也有特殊的情況;

比如:Oracle資料庫有一張表Node,欄位有:

ID:主鍵

parentID:父節點

STATID:查詢編碼

NAME:名稱

STATNAME:查詢名字

SCALE:父子級別

看的出,這是張儲存父子結構關係的表,而STATID的左右就是把父子結構的關係拼接起來:比如,某記錄為:

ID   parentID    STATID   NAME            STATNAME                 SCALE

01                1       華南             華南                      1

03      01        1s3      上海             華南s上海                2

05      03        1s3s5    浦東新區        華南s上海s浦東新區        3

很容易看的出三條記錄的父子結構,而STATID就是把當前記錄的所有父節點的ID,用's'連線起來;比如ID=05的記錄是“浦東新區”,是第三級的節點,它的父節點即二級節點是ID=03的“上海”,而“上海”的父節點即一級節點是ID=01的“華南”,這時“浦東新區”的STATID 就是1s3s5   

以此表為例,分割STATID!

常用函式:substr和instr

SUBSTR(string,start_position,[length])    求子字串,返回字串

解釋:string 元字串

       start_position   開始位置(從0開始)

       length 可選項,子字串的個數

For example:

substr("ABCDEFG", 0); //返回:ABCDEFG,擷取所有字元
substr("ABCDEFG", 2); //返回:CDEFG,擷取從C開始之後所有字元
substr("ABCDEFG", 0, 3); //返回:ABC,擷取從A開始3個字元
substr("ABCDEFG", 0, 100); //返回:ABCDEFG,100雖然超出預處理的字串最長度,但不會影響返回結果,系統按預處理字串最大數量返回。
substr("ABCDEFG", 0, -3); //返回:EFG,注意引數-3,為負值時表示從尾部開始算起,字串排列位置不變

INSTR(string,subString,position,ocurrence)查詢字串位置

解釋:string:源字串

      subString:要查詢的子字串

      position:查詢的開始位置

      ocurrence:源字串中第幾次出現的子字串

For example:

INSTR('CORPORATE FLOOR','OR', 3, 2)中,源字串為'CORPORATE FLOOR', 目標字串為'OR',起始位置為3,取第2個匹配項的位置;返回結果為 14

由上面兩個函式就可以進行字串的切割了!

比如SQL如下:

select n.ID,n.parentid,n.statid,n.name
   substr(n.statid,instr(n.statid,'s',1,2)+1,(instr(n.statid,'s',1,3)-instr   (n.statid,'s',1,2)-1)) market_id
   from node n

注意:上面查詢的就是statid中所有三級節點的ID值

       所有,真實使用中一定注意,只有三級(包含三級)以上的節點才有market_id值

==========================================================================================================================

declare aa varchar2 := 'wkressssdfdf';

begin

if instr(aa,'s')>0 then

dbms_output.put_line('有s字元');

else dbms_output.put_line('沒有s字元');

end if;

end;