2017-06-20 97 views
1

的下一步Occurence我有一個字符串甲骨文/ PLSQL-子串直到性格

myString = "C=3;A=1;B=2;" 

從中我想如下

SELECT 
    SUBSTR(myString, 
     INSTR(myString, 'A='), 
     INSTR(myString, ';')-1 
     ) AS val_a 
FROM DUAL; 

,給了我以下提取的A值結果

+-------+ 
| Val_A | 
+-------+ 
| A=1 | 
+-------+ 

但我只想要A的值。於是,我就加2的SUBSTR

SUBSTR(myString, 
     INSTR(myString, 'A=')+2, 
     INSTR(myString, ';')-1 
    ) 

第二個參數,但是這給了我

+-------+ 
| Val_A | 
+-------+ 
| 1;B | 
+-------+ 

可能有人請告訴我如何得到公正A=和下;之間的部分?

+0

SUBSTR'的'第三個參數是你所需要的子字符串的長度。 – Nitish

回答

2

這可以使用正則表達式和regexp_substr()

with data (mystring) as (
    select 'C=3;A=;B=2;' from dual union all 
    select 'C=3;A=1;B=2;' from dual union all 
    select 'C=3;A=12;B=2;' from dual union all 
    select 'C=3;A=123;B=2;' from dual 
) 
select mystring, regexp_substr(mystring, '(A=)([^\;)]*)', 1, 1, 'i', 2) as aval 
from data; 

(該with data (...)部分是僅存在生成一些TESTDATA)

返回

MYSTRING  | AVAL 
---------------+----- 
C=3;A=;B=2; |  
C=3;A=1;B=2; | 1 
C=3;A=12;B=2; | 12 
C=3;A=123;B=2; | 123 
+0

感謝您的回覆。但如果有'A = 12',那麼這個查詢仍然會返回'1'。我怎麼能在'A ='之後和';'之前選擇子字符串?我檢查了'regexp_substr'的​​文檔,但找不到我想要的東西:( – Amber

+0

@琥珀色:啊,是的,看到我的編輯 –

+0

這將失敗的輸入''C = 3; AA = 1; A = 4; B = 2;''。 – MT0

1

沒有正則表達式來完成:

WITH data (mystring) AS (
    SELECT 'C=3;AA=1;A=4;B=2;' FROM DUAL 
) 
SELECT SUBSTR(mystring, val_a_start, val_a_end - val_a_start) AS val_a 
FROM (
    SELECT mystring, 
     INSTR(mystring, ';A=') + 3 AS val_a_start, 
     INSTR(mystring, ';', INSTR(mystring, ';A=') + 3) AS val_a_end 
    FROM (
    SELECT ';' || mystring || ';' AS mystring 
    FROM data 
) 
) 

使用正則表達式:

WITH data (mystring) AS (
    SELECT 'C=3;AA=1;A=4;B=2;' FROM DUAL 
) 
SELECT REGEXP_SUBSTR(';' || mystring || ';', ';A=(.*?);', 1, 1, NULL, 1) AS val_a 
FROM data