在Oracle中使用正则表达式提取字符串部分

时间:2018-09-18 05:55:37

标签: sql regex oracle

enter image description here

enter image description here

我有一个需要从列值中提取特定部分的要求。

评论:项目BAN27:内容BAN27S001:偏差

现在在上面的文本中,我只需要在新列中添加BAN27S001部分。我唯一的共同因素是String的一部分(例如BAN27)在其他列中可用。现在,我尝试使用具有BAN27作为值的列来提取BAN27S001。我们可以使用正则表达式在Oracle中实现它吗。请提出是否还有其他方法可以实现这一点。

能帮我提取字符串吗?

谢谢 San

2 个答案:

答案 0 :(得分:2)

您可以使用[:alnum:]来检测字母数字部分,如以下示例所示:

with t(colA,colB) as
(
 select 'BAN27', 'Review: Project BAN27: Content BAN27S001: Deviation' from dual union all
 select 'BAN28', 'Review: Project BAN28: Content BAN28S002: Bio' from dual 
)
select colA,
       regexp_substr(colB,colA||'([[:alnum:]]+\.?)') as "Substring"
  from t;

COLA    Substring
-----   ---------
BAN27   BAN27S001
BAN28   BAN28S002

Rextester Demo 1

编辑:关于最后一条评论,如果要考虑最后三行,则可以使用以下摘录:

with t(colA,colB) as
(
 select '177', '177-130/ data continue to be collected' from dual union all
 select '177', '177-131 /log accordingly' from dual union all
 select '524', '524 - 23 & get these resolved' from dual    
)
select colA, nvl( regexp_substr(colB,colA||'(\-[[:digit:]]+)'),
                  regexp_substr(colB,colA||'([[:space:]]\-[[:space:]][[:digit:]]+)')) "Substring"
  from t;

COLA    Substring
-----   ---------
177     177-130
177     177-131
524     524 - 23

Rextester Demo 2

答案 1 :(得分:1)

此查询将识别colb数据,例如ColA +'S'

SELECT 
      REGEXP_SUBSTR (colb, '[^ ]+', 1,
      (case  
       when REGEXP_SUBSTR(colb, '[^ ]+', 1, 1) like '%'|| cola||'S%' then 1 
       when REGEXP_SUBSTR(colb, '[^ ]+', 1, 2) like '%'|| cola||'S%' then 2 
      when REGEXP_SUBSTR(colb, '[^ ]+', 1, 3) like '%'|| cola||'S%' then 3
      when REGEXP_SUBSTR(colb, '[^ ]+', 1, 4) like '%'|| cola||'S%' then 4  
      when REGEXP_SUBSTR(colb, '[^ ]+', 1, 5) like '%'|| cola||'S%' then 5 
     when REGEXP_SUBSTR(colb, '[^ ]+', 1, 6) like '%'|| cola||'S%' then 6
     end) )
FROM tname ;