2015-02-11 58 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()