oracle截取字符串,定索引


轉載:https://www.cnblogs.com/qmfsun/p/4493918.html

 

使用Oracle中Instr()和substr()函數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
在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個字符開始搜索<br>
SQL>  select  instr( 'yuechaotianyuechao' , 'ao' , 7) position  from  dual;
 
  POSITION
  ----------
  17
 
從第1個字符開始,搜索第2次出現子串的位置<br>
SQL>  select  instr( 'yuechaotianyuechao' , 'ao' , 1, 2) position  from  dual;
 
  POSITION
  ----------
  17<br><br>------------------------------------------------------------- <br><br>對於instr函數,我們經常這樣使用:從一個字符串中查找指定子串的位置。例如: <br><br>SQL>  select  instr( 'abcdefgh' , 'de' ) position  from  dual; <br><br><br>POSITION <br>---------- <br>4 <br>從1開始算 d排第四所以返回4 <br><br>SQL> select  instr( 'abcdefghbc' , 'bc' ,3) position  from  dual; <br><br>POSITION <br>---------- <br>9 <br>從第3個字符開始算起 第3個字符是c,所以從3開始以后的字符串找查找bc,返回9 <br><br>--------------------------- <br>從第1個字符開始,查找第2次出現子串的位置 <br>SQL>  select  instr( 'qinyinglianqin' , 'qin' , 1, 2) position  from  dual; <br>POSITION <br>---------- <br>12 <br><br>----------------------------------------------------------------------
 
  注意:1。若‘起始位置’=0 時返回結果為0,
       2。這里只有三個參數,意思是查找第一個要查找字符的位置(因為 ‘第幾次出現’默認為1),
  當‘起始位置’不大於要查找的第一個字符的位置時,返回的值都將是第一個字符的位置,如果‘起始位置’大於要查找的第一個字符的位置時,返回的值都將是第2個字符的位置,依此類推……(但是也是以第一個字符開始計數)
 
<br><br><br>
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<br><br><br>SUBSTR()函數   <br>1.用處:是從給定的字符表達式或備注字段中返回一個子字符串。    <br><br>2.語法格式:SUBSTR(cExpression,nStartPosition [,nCharactersReturned])    <br><br>其中,cExpression指定要從其中返回字符串的字符表達式或備注字段; <br><br>nStartPosition用於指定返回的字符串在字符表達式或備注字段中的位置, <br><br>nCharactersReturned用於指定返回的字符數目,缺省時返回字符表達式的值結束前的全部字符。   <br><br>3.舉例:STORE 'abcdefghijlkm'  To mystring    <br><br>SUBSTR(mystring ,1,5) 顯示  "abcde"   1 從第一個字符開始 截取的字符中,包括第一個字符  <br><br>SUBSTR(mystring ,6) 顯示  "fghijklm"     <br><br>SUBSTR(mystring,-2)顯示“km”   最右邊一個字符是-1,最右邊左邊的字符是-2,然后默認是從左向有取剩下的全部的字符 <br><br>SUBSTR(mystrng,-4)顯示“jlkm”

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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是啥意思:

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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;

 

1
2
3
4
5
6
7
8
就是在表中有一個字段,最開始的是[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 <br><br>比如數據庫有個字段為 tellsid,存儲值的格式為 <br> "湖北_5874"   我想單獨讀取這個字段里下橫線后面的部分並轉換為數字  要怎么實現啊?<br>后面數字部分是序列產生的, 前面部分是地區名,都沒有固定的長度<br><br>首先用instr檢查 '_' 的位置,再substr就ok了。<br><br>SELECT to_number(substr(tellsid,<br>                         instr(tellsid,  '_' , 1) + 1))<br> FROM your_tablename;<br><br>如果版本是10g以上,試試這個:<br>SELECT to_number(regexp_substr(tellsid,  '[0-9]{1,}' , 1))<br> FROM your_tablename;<br><br>regexp_substr( 'fdaf_4556' , '[[:digit:]]+' ),還是感覺這個好點。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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%'  ;<br><br><br><br>

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');

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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

開始時的 sql

 
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的數據量比較大,所以執行起來相當慢。

使用 Instr函數

 
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')。

Oracle Instr 函數

  Description of instr.gif follows  

其中: 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

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 '

 

 

1
2
3
oralce查詢字符串截取<br>
select  substr( 'XIHE@GXCOURT.GX' ,instr( 'XIHE@GXCOURT.GX' , '@' )+1)  from  dual<br>
字段loginname= 'XIHE@GXCOURT.GX' 截取@后面的內容不包括@<br><br><br>sql :charindex( '字符串' ,字段)>0 charindex( 'administrator' ,MUserID)>0 <br><br><br>oracle:instr(字段, '字符串' ,1,1) >0 instr(MUserID, 'administrator' ,1,1)>0 <br><br><br>在項目中用到了Oracle中 Instr 這個函數,順便仔細的再次學習了一下這個知識。 <br><br>Oracle中,可以使用 Instr <br>函數對某個字符串進行判斷,判斷其是否含有指定的字符。 <br><br>其語法為: <br>Instr( string , substring, position, <br>occurrence) <br>其中 <br><br> string :代表源字符串; <br><br>substring:代表想聰源字符串中查找的子串; <br><br><br>position:代表查找的開始位置,該參數可選的,默認為 1; <br><br><br>occurrence:代表想從源字符中查找出第幾次出現的substring,該參數也是可選的,默認為1; <br>如果 position <br>的值為負數,那么代表從右往左進行查找。 <br>返回值為:查找到的字符串的位置。 <br><br>對於 Instr <br>函數,我們經常這樣使用:從一個字符串中查找指定子串的位置。 <br><br>例如: <br><br>SELECT Instr( 'Hello Word' , <br> 'o' , -1, 1)  "String"  FROM Dual 的顯示結果是 <br><br>Instring <br>———— <br>8

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2024 CODEPRJ.COM