oracle截取字段中的部分字符串


使用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

開始時的 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

 

 

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刪除。



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