如何在Oracle SQL中的第一个连字符之后和第三个连字符之前提取数据

时间:2019-05-13 22:28:46

标签: sql oracle

我有一个要求,其中我有一个像STEP_D1_DEVTS_MN_PQ_LS这样的列值

我想要第一个下划线之后和第三个下划线之前的值,然后像下面这样用hypen替换下划线

D1-DEVTS

有人可以帮我吗?

我尝试过SUBSTRINSTR并没有帮助我。

2 个答案:

答案 0 :(得分:1)

一种选择是将并发regexp_substr表达式与replace一起使用

with t(str) as
(
 select 'STEP_D1_DEVTS_MN_PQ_LS' from dual   
)    
select replace(regexp_substr(str,'[^_]+[_]',1,2)||regexp_substr(str,'[^_]+',1,3),'_','-') 
    as "Result String"
  from t;

Result String
-------------
D1-DEVTS

答案 1 :(得分:1)

另一种方法是使用SUBSTR + INSTR(当然还有REPLACE):

SQL> with test (col) as
  2    (select 'STEP_D1_DEVTS_MN_PQ_LS' from dual)
  3  select
  4    replace(substr(col,
  5                   instr(col, '_', 1, 1) + 1,                          --> start after the 1st underscore
  6                   instr(col, '_', 1, 3) - instr(col, '_', 1, 1) - 1   --> take everything that's between 1st and 3rd underscore
  7                  ), '_', '-') result                                  --> replace _ with -
  8  from test;

RESULT
--------------------
D1-DEVTS

SQL>