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;