我有一个像这样的字符串 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)
)。
请指导。
答案 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()