拆分字符串并在oracle中查找子字符串索引

时间:2015-02-11 10:48:34

标签: sql oracle plsql plsqldeveloper

我有一个像这样的字符串 TESTAPP_B_ABCD_JP_0_FILENAME 我想索引" ABCD " 我试过了

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

它返回10 ..这意味着它给我索引计数字符

我希望输出为3(拆分字符串TESTAPP(1),B(2),ABCD(3))。

请指导。

1 个答案:

答案 0 :(得分:0)

这种方法实际上是通过首先使用_作为分隔符

来标记字符串
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()