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