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)
)。
请指导。
我有这样 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)
)。
请指导。
这种做法实际上是由第一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()
http://www.sqlfiddle.com/#!4/d41d8/37569将让你开始 – 2015-02-11 10:58:37