使用Oracle中Instr()和substr()函數:
在Oracle中可以使用instr函數對某個字符串進行判斷,判斷其是否含有指定的字符。 其語法為: instr(sourceString,destString,start,appearPosition). instr('源字符串' , '目標字符串' ,'開始位置','第幾次出現') 其中sourceString代表源字符串; destString代表想聰源字符串中查找的子串; start代表查找的開始位置,該參數可選的,默認為1; appearPosition代表想從源字符中查找出第幾次出現的destString,該參數也是可選的,默認為1; 如果start的值為負數,那么代表從右往左進行查找,但是位置數據仍然從左向右計算。 返回值為:查找到的字符串的位置。 對於instr函數,我們經常這樣使用:從一個字符串中查找指定子串的位置。例如: SQL> select instr('yuechaotianyuechao','ao') position from dual; POSITION ---------- 6 從第7個字符開始搜索
SQL> select instr('yuechaotianyuechao','ao', 7) position from dual; POSITION ---------- 17 從第1個字符開始,搜索第2次出現子串的位置
SQL> select instr('yuechaotianyuechao','ao', 1, 2) position from dual; POSITION ---------- 17
-------------------------------------------------------------
對於instr函數,我們經常這樣使用:從一個字符串中查找指定子串的位置。例如:
SQL> select instr('abcdefgh','de') position from dual;
POSITION
----------
4
從1開始算 d排第四所以返回4
SQL>select instr('abcdefghbc','bc',3) position from dual;
POSITION
----------
9
從第3個字符開始算起 第3個字符是c,所以從3開始以后的字符串找查找bc,返回9
---------------------------
從第1個字符開始,查找第2次出現子串的位置
SQL> select instr('qinyinglianqin','qin', 1, 2) position from dual;
POSITION
----------
12
---------------------------------------------------------------------- 注意:1。若‘起始位置’=0 時返回結果為0, 2。這里只有三個參數,意思是查找第一個要查找字符的位置(因為 ‘第幾次出現’默認為1), 當‘起始位置’不大於要查找的第一個字符的位置時,返回的值都將是第一個字符的位置,如果‘起始位置’大於要查找的第一個字符的位置時,返回的值都將是第2個字符的位置,依此類推……(但是也是以第一個字符開始計數)
substr函數的用法,取得字符串中指定起始位置和長度的字符串 ,默認是從起始位置到結束的子串。 substr( string, start_position, [ length ] ) substr('目標字符串',開始位置,長度) 如: substr('This is a test', 6, 2) would return 'is' substr('This is a test', 6) would return 'is a test' substr('TechOnTheNet', -3, 3) would return 'Net' substr('TechOnTheNet', -6, 3) would return 'The'select substr('Thisisatest', -4, 2) value from dual
SUBSTR()函數
1.用處:是從給定的字符表達式或備注字段中返回一個子字符串。
2.語法格式:SUBSTR(cExpression,nStartPosition [,nCharactersReturned])
其中,cExpression指定要從其中返回字符串的字符表達式或備注字段;
nStartPosition用於指定返回的字符串在字符表達式或備注字段中的位置,
nCharactersReturned用於指定返回的字符數目,缺省時返回字符表達式的值結束前的全部字符。
3.舉例:STORE'abcdefghijlkm' To mystring
SUBSTR(mystring ,1,5) 顯示 "abcde" 1 從第一個字符開始 截取的字符中,包括第一個字符
SUBSTR(mystring ,6) 顯示 "fghijklm"
SUBSTR(mystring,-2)顯示“km” 最右邊一個字符是-1,最右邊左邊的字符是-2,然后默認是從左向有取剩下的全部的字符
SUBSTR(mystrng,-4)顯示“jlkm”
oracle截取字符串 將 C3411.907w15 截取點號之前的字符串 C3411 SUBSTR ('C3411.907w15', 0, INSTR ('C3411.907w15, '.', 1, 1) - 1) SELECT SUBSTR ('C3411.907w15', 0, INSTR ('C3411.907w15, '.', 1, 1) - 1) www.2cto.com FROM DUAL 將 C3411.907w15 截取點號之后 的字符串 907w15 SUBSTR ('C3411.907w15', INSTR ('C3411.907w15', '.', 1, 1)+1) SELECT SUBSTR ('C3411.907w15', INSTR ('C3411.907w15', '.', 1, 1)+1) FROM DUAL
項目應用實例:
原始字符串:
原始字段中存在7個“_”,我現在只想取出最后一個“_”后面的字符串,該怎么解決呢?
分兩步:
第一步,通過Instr()函數,找到第7個“_”字符:
select instr('Q房網集團_經紀事業部_華南區_深圳世華_營業部_南山前海區_前海中心片區_前海五分店','_', 1, 7) fdisplayname from SHENZHENJM1222.B
或者:
select instr('Q房網集團_經紀事業部_華南區_深圳世華_營業部_南山前海區_前海中心片區_前海五分店', '_', -1, 1) fdisplayname FROM SHENZHENJM1222.B
兩者效果一樣,下面的-1,表示從右邊開始算起始字符,1表示獲取第一個“_”
獲取到的結果如圖:
第2步,通過substr()函數,取出所需要的字段:
select substr(fdisplayname,instr(fdisplayname,'_',-1,1)+1) fdisplayname from SHENZHENJM1222.B
fdisplayname:代表字段名,相當於元字符串
重點介紹一下+1
+1表示在目標字符串“_”后的第一個字符串開始截取
下面看一下不同的數字的情況:
select substr(fdisplayname,instr(fdisplayname,'_',-1,1)+1) fdisplayname from SHENZHENJM1222.B
在來看一下instr(fdisplayname,'_',-1,1)中的1是啥意思:
Oracle中INSTR和SUBSTR的用法 Oracle中INSTR的用法: INSTR方法的格式為 INSTR(源字符串, 要查找的字符串, 從第幾個字符開始, 要找到第幾個匹配的序號) 返回找到的位置,如果找不到則返回0. 例如:INSTR('CORPORATE FLOOR','OR', 3, 2)中,源字符串為'CORPORATE FLOOR', 在字符串中查找'OR',從第三個字符位置開始查找"OR",取第三個字后第2個匹配項的位置。 默認查找順序為從左到右。當起始位置為負數的時候,從右邊開始查找。 所以SELECT INSTR('CORPORATE FLOOR', 'OR', -1, 1) "aaa" FROM DUAL的顯示結果是 Instring —————— 14 oracle的substr函數的用法: 取得字符串中指定起始位置和長度的字符串 substr( string, start_position, [ length ] ) 如: substr('This is a test', 6, 2) would return 'is' substr('This is a test', 6) would return 'is a test' substr('TechOnTheNet', -3, 3) would return 'Net' substr('TechOnTheNet', -6, 3) would return 'The' select substr('Thisisatest', -4, 2) value from dual 綜合應用: SELECT INSTR('CORPORATE FLOOR', 'OR', -1, 1) "Instring" FROM DUAL --INSTR(源字符串, 目標字符串, 起始位置, 匹配序號) SELECT INSTR('CORPORATE FLOOR','OR', 3, 2) "Instring" FROM DUAL SELECT INSTR('32.8,63.5',',', 1, 1) "Instring" FROM DUAL SELECT SUBSTR('32.8,63.5',INSTR('32.8,63.5',',', 1, 1)+1) "INSTRING" FROM DUAL SELECT SUBSTR('32.8,63.5',1,INSTR('32.8,63.5',',', 1, 1)-1) "INSTRING" FROM DUAL -- CREATED ON 2008-9-26 BY ADMINISTRATOR DECLARE -- LOCAL VARIABLES HERE T VARCHAR2(2000); S VARCHAR2(2000); NUM INTEGER; I INTEGER; POS INTEGER; BEGIN -- TEST STATEMENTS HERE T := '12.3,23.0;45.6,54.2;32.8,63.5;'; SELECT LENGTH(T) - LENGTH(REPLACE(T, ';', '')) INTO NUM FROM DUAL; DBMS_OUTPUT.PUT_LINE('NUM:' || NUM); POS := 0; FOR I IN 1 .. NUM LOOP DBMS_OUTPUT.PUT_LINE('I:' || I); DBMS_OUTPUT.PUT_LINE('POS:' || POS); DBMS_OUTPUT.PUT_LINE('==:' || INSTR(T, ';', 1, I)); DBMS_OUTPUT.PUT_LINE('INSTR:' || SUBSTR(T, POS + 1, INSTR(T, ';', 1, I) - 1)); POS := INSTR(T, ';', 1, I); END LOOP; END; -- Created on 2008-9-26 by ADMINISTRATOR declare -- Local variables here i integer; T VARCHAR2(2000); S VARCHAR2(2000); begin -- Test statements here --歷史狀態 T := '12.3,23.0;45.6,54.2;32.8,63.5;'; IF (T IS NOT NULL) AND (LENGTH(T) > 0) THEN --T := T || ','; WHILE LENGTH(T) > 0 LOOP --ISTATUSID := 0; S := TRIM(SUBSTR(T, 1, INSTR(T, ';') - 1)); IF LENGTH(S) > 0 THEN DBMS_OUTPUT.PUT_LINE('LAT:'||SUBSTR('32.8,63.5',1,INSTR('32.8,63.5',',', 1, 1)-1)); DBMS_OUTPUT.PUT_LINE('LON:'||SUBSTR('32.8,63.5',INSTR('32.8,63.5',',', 1, 1)+1)); -- COMMIT; END IF; T := SUBSTR(T, INSTR(T, ';') + 1); END LOOP; END IF; end;
就是在表中有一個字段,最開始的是[XXXX]字樣,我要如何操作,才能獲得[]中字符? select substr('[xxxx]', instr('[xxxx]','[') + 1, instr('[xxxx]',']') - instr('[xxxx]','[') -1 ) from dual 您的需要就是去掉[]而獲得[]之間的字符對吧 其實很簡單,有一個截取字符的函數substr('string',n,m) 其中'string'是目標字符串,n為截取的起始位置,m為結束的位置。 例如:select substr('[xxxx]' , 2, 4) from 表名;意思就是對[xxxx]從第二個位置開始截取4個字符。 結果就是 xxxx
比如數據庫有個字段為 tellsid,存儲值的格式為
"湖北_5874" 我想單獨讀取這個字段里下橫線后面的部分並轉換為數字 要怎么實現啊?
后面數字部分是序列產生的, 前面部分是地區名,都沒有固定的長度
首先用instr檢查'_'的位置,再substr就ok了。
SELECT to_number(substr(tellsid,
instr(tellsid, '_', 1) + 1))
FROM your_tablename;
如果版本是10g以上,試試這個:
SELECT to_number(regexp_substr(tellsid, '[0-9]{1,}', 1))
FROM your_tablename;
regexp_substr('fdaf_4556','[[:digit:]]+'),還是感覺這個好點。
INSTR (源字符串, 目標字符串, 起始位置, 匹配序號) 在Oracle/PLSQL中,instr函數返回要截取的字符串在源字符串中的位置。只檢索一次,就是說從字符的開始 到字符的結尾就結束。 語法如下: instr( string1, string2 [, start_position [, nth_appearance ] ] ) 參數分析: string1 源字符串,要在此字符串中查找。 string2 要在string1中查找的字符串. start_position 代表string1 的哪個位置開始查找。此參數可選,如果省略默認為1. 字符串索引從1開始。如果此參數為正,從左到右開始檢索,如果此參數為負,從右到左檢索,返回要查找的字符串在源字符串中的開始索引。 nth_appearance 代表要查找第幾次出現的string2. 此參數可選,如果省略,默認為 1.如果為負數系統會報錯。 注意: 如果String2在String1中沒有找到,instr函數返回0. 示例: SELECT instr('syranmo','s') FROM dual; -- 返回 1 SELECT instr('syranmo','ra') FROM dual; -- 返回 3 1 SELECT instr('syran mo','a',1,2) FROM dual; -- 返回 0 (根據條件,由於a只出現一次,第四個參數2,就是說第2次出現a的位置,顯然第2次是沒有再出現了,所以結果返回0。注意空格也算一個字符!) SELECT instr('syranmo','an',-1,1) FROM dual; -- 返回 4 (就算是由右到左數,索引的位置還是要看‘an’的左邊第一個字母的位置,所以這里返回4) SELECT instr('abc','d') FROM dual; -- 返回 0 注:也可利用此函數來檢查String1中是否包含String2,如果返回0表示不包含,否則表示包含。 對於上面說到的,我們可以這樣運用instr函數。請看下面示例: 如果我有一份資料,上面都是一些員工的工號(字段:CODE),可是我現在要查詢出他們的所有員工情況,例如名字,部門,職業等等,這里舉例是兩個員工,工號分別是’A10001′,’A10002′,其中假設staff是員工表,那正常的做法就如下: 1 2 SELECT code , name , dept, occupation FROM staff WHERE code IN ('A10001','A10002'); 或者: SELECT code , name , dept, occupation FROM staff WHERE code = 'A10001' OR code = 'A10002'; 有時候員工比較多,我們對於那個’覺得比較麻煩,於是就想,可以一次性導出來么?這時候你就可以用instr函數,如下: SELECT code , name , dept, occupation FROM staff WHERE instr('A10001,A10002',code)>0; 查詢出來結果一樣,這樣前后只用到兩次單引號,相對方便點。 還有一個用法,如下: SELECT code, name, dept, occupation FROM staff WHERE instr(code, '001') > 0; 等同於 SELECT code, name, dept, occupation FROM staff WHERE code LIKE '%001%' ;
instr(string1,string2[,start_position[,nth_appearence]])
string1:要在此字符串中查找。
string2:要在string1中查找的字符串。
start_position:從string1開始查找的位置。可選,默認為1,正數時,從左到右檢索,負數時,從右到左檢索。
nth_appearence:查找第幾次出現string2。可選,默認為1,不能為負。
注:如果沒有查找到,返回0。
例如:
select instr('abcd','a') from dual; --返回1 select instr('abcd','c') from dual; --返回3 select instr('abcd','e') from dual; --返回0
該函數可以用於模糊查詢以及判斷包含關系:
例如:
① select code, name, dept, occupation from staff where instr(code, '001') > 0;
等同於
select code, name, dept, occupation from staff where code like '%001%' ;
② select ccn,mas_loc from mas_loc where instr('FH,FHH,FHM',ccn)>0;
等同於
select ccn,mas_loc from mas_loc where ccn in ('FH','FHH','FHM');
INSTR(源字符串, 目標字符串, 起始位置, 匹配序號) : 在Oracle/PLSQL中,instr函數返回要截取的字符串在源字符串中的位置。只檢索一次,就是說從字符的開始到字符的結尾就結束。 一、語法如下: instr( string1, string2 [, start_position [, nth_appearance ] ] ) 1>參數分析: ①string1:源字符串,要在此字符串中查找。 ②string2:要在string1中查找的字符串. ③start_position:代表string1 的哪個位置開始查找。 注:此參數可選,如果省略默認為1. 字符串索引從1開始。 如果此參數為正,從左到右開始檢索。 如果此參數為負,從右到左檢索,返回要查找的字符串在源字符串中的開始索引。 ④nth_appearance:代表要查找第幾次出現的string2. 注:此參數可選,如果省略,默認為 1.如果為負數系統會報錯。 注意:如果String2在String1中沒有找到,instr函數返回0. 2>示例: SELECT instr('syranmo','s') FROM dual; -- 返回 1 SELECT instr('syranmo','ra') FROM dual; -- 返回 3 SELECT instr('syran mo','a',1,2) FROM dual; -- 返回 0 SELECT instr('syranmo','an',-1,1) FROM dual; -- 返回 4 SELECT instr('abc','d') FROM dual; -- 返回 0 二、其他應用實例: 1>從staff表查詢工號code分別是’A10001′,’A10002′的員工: ①SELECT code , name , dept, occupation FROM staff WHERE code IN ('A10001','A10002'); ②SELECT code , name , dept, occupation FROM staff WHERE code = 'A10001' OR code = 'A10002'; ③SELECT code , name , dept, occupation FROM staff WHERE instr('A10001,A10002',code)>0; 這種用法時常被用於存儲過程,將范圍字符串作為參數傳入。如果使用①的SQL寫法,將拼好的字符串傳入直接使用,則存儲過程會報錯。此時會用這種方法查找,傳入的拼好字符串便可直接使用。 2>模糊查詢: ①SELECT code, name, dept, occupation FROM staff WHERE code LIKE '%001%' ; ②SELECT code, name, dept, occupation FROM staff WHERE instr(code, '001') > 0;
今天在寫 sql時遇到一個情況,表 A中的 ID 是按照 TREE結構存儲的。現在需要和表 B中的 NODE_ID連接,取出 B中 NODE_ID可以和 A中任意一個 level的 NODE_ID連接的信息。但是表 B中的 NODE_ID 具體對應到表 A中哪個 level是未知的。對此,最先想到使用的是 OR運算,但是由於效率太低,速度很慢,后來使用 INSTR代替,查詢速度得到明顯提高。
表 A - A_SEQ_ID, LVL1_NODE_ID, LVL2_NODE_ID, LVL3_NODE_ID, LVL4_NODE_ID, LVL5_NODE_ID, LVL6_NODE_ID, LVL7_NODE_ID, LVL8_NODE_ID, LVL9_NODE_ID, LVL10_NODE_ID
表 B - B_SEQ_ID, NODE_ID, INFO
01.
SELECT *
02.
FROM A, B
03.
WHERE A.LVL1_NODE_ID = B.NODE_ID OR
04.
A.LVL2_NODE_ID = B.NODE_ID OR
05.
A.LVL3_NODE_ID = B.NODE_ID OR
06.
A.LVL4_NODE_ID = B.NODE_ID OR
07.
A.LVL5_NODE_ID = B.NODE_ID OR
08.
A.LVL6_NODE_ID = B.NODE_ID OR
09.
A.LVL7_NODE_ID = B.NODE_ID OR
10.
A.LVL8_NODE_ID = B.NODE_ID OR
11.
A.LVL9_NODE_ID = B.NODE_ID OR
12.
A.LVL10_NODE_ID = B.NODE_ID;
這條 sql雖然可以達到最終的目的,但是由於表 A和表 B的數據量比較大,所以執行起來相當慢。
1.
SELECT *
2.
FROM A, B
3.
WHERE instr(
4.
(
','
||A.LVL1_NODE_ID||
','
||A.LVL2_NODE_ID||
','
||A.LVL3_NODE_ID||
5.
','
||A.LVL4_NODE_ID||
','
||A.LVL5_NODE_ID||
','
||A.LVL6_NODE_ID||
6.
','
||A.LVL7_NODE_ID||
','
||A.LVL8_NODE_ID||
','
||A.LVL9_NODE_ID||
7.
','
||A.LVL10_NODE_ID),
8.
','
||B.NODE_ID||
','
) >
0
;
比起 OR語句一個字段一個字段的比較,instr函數更加高效。當 instr函數匹配到子串的時候就會返回子串在源字符串中的位置,所以這里用 大於0 即表示在表 A的源字符串中可以找到表 B的 NODE_ID (子串或源字符串為 NULL時返回 NULL)。
注:給每個字段加上逗號(',')的原因是匹配的一種方法,例如源數據是 1,2,3,13. 子串是 23.如果直接拼接的話,源字符串就變成 '12313',用instr('12313', '23') 明顯可以匹配成功,但事實並非如此。所以換成給每個字符兩邊都加上逗號,不僅匹配字符也匹配其兩邊的逗號 - instr(',1,2,3,13,', '23')。
其中: INSTR 接受 characters格式的輸入字符集,返回 characters格式的子串位置,位置索引從 1開始; INSTRB 使用 bytes 而非 characters; INSTRC 使用 Unicode complete characters; INSTR2 使用UCS2 code points; INSTR4 使用UCS4 code points。
對於源字符串,除了INSTRC, INSTR2, 和 INSTR4 不允許CLOB 和 NCLOB 類型外,其他兩個函數的源字符串接受CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB 或 NCLOB等任意數據類型。
instr 語法如下: instr( string1, string2, start_position,nth_appearance )
string1 | 源字符串,要在此字符串中查找。 |
string2 | 要在string1中查找的字符串 。 |
start_position | 代表string1 的哪個位置開始查找。此參數可選,如果省略默認為1. 字符串索引從1開始。如果此參數為正,從左到右開始檢索,如果此參數為負,從右到左檢索,返回要查找的字符串在源字符串中的開始索引。 |
nth_appearance | 代表要查找第幾次出現的string2. 此參數可選,如果省略,默認為 1.如果為負數系統會報錯。 |
注意: 如果String2在String1中沒有找到,instr函數返回0。 示例: SELECT instr('syranmo','s') FROM dual; -- 返回 1 SELECT instr('syranmo','ra') FROM dual; -- 返回 3 SELECT instr('syran mo','a',1,2) FROM dual; -- 返回 0
oracle 截取字符(substr),檢索字符位置(instr) case when then else end語句使用 收藏 常用函數:substr和instr 1.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", -3); //返回:EFG,注意參數-3,為負值時表示從尾部開始算起,字符串排列位置不變。 2.INSTR(string,subString,position,ocurrence)查找字符串位置 解釋:string:源字符串 subString:要查找的子字符串 position:查找的開始位置 ocurrence:源字符串中第幾次出現的子字符串 For example: INSTR('CORPORATE FLOOR','OR', 3, 2)中,源字符串為'CORPORATE FLOOR', 目標字符串為'OR',起始位置為3,取第2個匹配項的位置;返回結果為 14 '
oralce查詢字符串截取
select substr('XIHE@GXCOURT.GX',instr('XIHE@GXCOURT.GX','@')+1) from dual
字段loginname='XIHE@GXCOURT.GX'截取@后面的內容不包括@
sql :charindex('字符串',字段)>0 charindex('administrator',MUserID)>0
oracle:instr(字段,'字符串',1,1) >0 instr(MUserID,'administrator',1,1)>0
在項目中用到了Oracle中 Instr 這個函數,順便仔細的再次學習了一下這個知識。
Oracle中,可以使用 Instr
函數對某個字符串進行判斷,判斷其是否含有指定的字符。
其語法為:
Instr(string, substring, position,
occurrence)
其中
string:代表源字符串;
substring:代表想聰源字符串中查找的子串;
position:代表查找的開始位置,該參數可選的,默認為 1;
occurrence:代表想從源字符中查找出第幾次出現的substring,該參數也是可選的,默認為1;
如果 position
的值為負數,那么代表從右往左進行查找。
返回值為:查找到的字符串的位置。
對於 Instr
函數,我們經常這樣使用:從一個字符串中查找指定子串的位置。
例如:
SELECT Instr('Hello Word',
'o', -1, 1) "String" FROM Dual 的顯示結果是
Instring
————
8
本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。