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

Split the string and find substrings index in oracle

我有这样的字符串 TESTAPP_B_ABCD_JP_0_FILENAME 我想要“ABCD”的索引 我试过了

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

它returns 10..这意味着它给我索引计算字符

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

请指导。

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

对字符串进行标记来实现的
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 的第一个表达式实际上是 table 本身的表示。第二个表达式 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()