Oracle / PLSQL-子串直到下一个角色出现

时间:2017-06-20 09:26:44

标签: sql oracle

我有一个字符串

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

我试图从中提取A的值如下

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

给出了以下结果

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

但我只想要A的价值。所以我尝试在SUBSTR

的第二个参数中添加2
SUBSTR(myString,
       INSTR(myString, 'A=')+2,
       INSTR(myString, ';')-1
      )

但那给了我

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

有人可以告诉我如何获得A=和下一个;之间的部分吗?

2 个答案:

答案 0 :(得分: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 (...)部分仅用于生成一些测试数据)

返回

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 

答案 1 :(得分: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
相关问题