2015-02-11 57 views
0

我有這樣 TESTAPP_B_ABCD_JP_0_FILENAME 字符串我想「ABCD」 我已經試過分割字符串,找到子在Oracle索引

select INSTR('TESTAPP_B_ABCD_JP_0_FILENAME', '_ABCD_') from dual; 

返回10..It意味着它的索引給我指數字符

我想輸出爲3(分割字符串TESTAPP(1),B(2),ABCD(3))。

請指導。

+0

http://www.sqlfiddle.com/#!4/d41d8/37569將讓你開始 – 2015-02-11 10:58:37

回答

0

這種做法實際上是由第一tokenising使用_作爲分隔符

WITH MY_DATA(str) AS 
(
    SELECT 'TESTAPP_B_ABCD_JP_0_FILENAME' FROM DUAL 
    UNION ALL 
    SELECT 'TESTAPP1_C_1_ABCD_JP_1_FILENAME' FROM DUAL 
),SPLITTED_STRING(pos,word,str) AS 
(
    select level,REGEXP_SUBSTR(str, '[^_]+',1,level),str from MY_DATA 
    CONNECT BY LEVEL <= REGEXP_COUNT(str,'_')+1 
    AND PRIOR sys_guid() IS NOT NULL 
    AND PRIOR str = str 
) 
SELECT * FROM SPLITTED_STRING 
WHERE word='ABCD'; 

我在這裏使用CTE字符串工作。 MY_DATA的第一個表達式實際上是表格本身的表示形式。第二個表達式SPLITTED_STRING用於將列數據標記爲多行。

  POS WORD     STR       
-------------------------------------------------------------------------- 
      1 TESTAPP1    TESTAPP1_C_1_ABCD_JP_1_FILENAME 
      2 C      TESTAPP1_C_1_ABCD_JP_1_FILENAME 
      3 1      TESTAPP1_C_1_ABCD_JP_1_FILENAME 
      4 ABCD     TESTAPP1_C_1_ABCD_JP_1_FILENAME 
      5 JP     TESTAPP1_C_1_ABCD_JP_1_FILENAME 
      6 1      TESTAPP1_C_1_ABCD_JP_1_FILENAME 
      7 FILENAME    TESTAPP1_C_1_ABCD_JP_1_FILENAME 

而且唯一區分每個行中,我們使用sys_guid()