使用正则表达式提取SQL中的字符串部分

时间:2018-09-20 13:55:09

标签: regex oracle

enter image description here

大家好,

我有一个与SQL中的正则表达式相关的查询。

我有一种情况,必须从一列中提取一部分字符串。该列的部分将以我的A列为前缀。请参阅屏幕截图以获取示例数据。我还将预期的输出添加到单独的列中(以绿色突出显示)。

场景:

  1. 现在,如果列值具有多个唯一数字,则必须使用Null来显示 例如:要在批准后验证 CAN06010025 CAN06010026 CAN06010030

在上面的字符串中,我有多个数字(粗体部分) 而这种情况应该忽略(这意味着它必须给我Null值)。

  1. 如果只有一个数字并且它是重复的,那么我必须考虑这种情况并提取String的一部分。 例如:Project USA12:ID USA12S001 :需要联系- USA12S001 -要更新的表格

在此示例中,我要提取的部分是重复的,我希望仅提取突出显示的部分。

其他情况也是如此。

我尝试使用以下sql。面临的挑战是我的Col A也可以出现在Col B中(屏幕快照的第2行),当我使用REGEXP_COUNT函数计数时,此代码正在考虑我的Col A部分,并将其值设置为Null。我的期望是从该列中提取USA12S001部分。

在满足以上两个条件的情况下,您能帮助实现这一目标吗?

SQL

SELECT
   ColA,
   ColB,
   case when REGEXP_COUNT(ColB,ColA) >2 THEN NULL 
   ELSE REPLACE(REPLACE(concat(regexp_substr(ColB,ColA||'([[:alnum:]]+\.?)'),
    nvl(regexp_substr(ColB,ColA||'(\-[[:digit:]]+)'),
   regexp_substr(ColB,ColA||'([[:space:]]\-[[:space:]][[:digit:]]+)'))),
               ' ',''),'.','') 
    END AS Result  
FROM
   table

测试数据:

颜色A

CAN06

USA12

USA27

HUN04

CAN05

USA24

CAN06


Col B

在批准后验证CAN06010025,CAN06010026和CAN06010030

USA12项目:ID USA12S001:需要联系-USA12S001-表格进行更新

USA27项目:ID:USA27S001:产品

要在到期日之后查看ID HUN04S002-HUN04S004。

ID:CAN05S005,详细信息为CAN05S005。

USA24项目:ID:USA24S009:数据发布

“项目:主题CAN06S009:V2和V3-ID CAN06S010:V1”

1 个答案:

答案 0 :(得分:1)

如果唯一的问题是REGEXP_COUNT,那么答案很简单:更改

case when REGEXP_COUNT(ColB,ColA) >2

收件人:

case when REGEXP_COUNT(ColB,ColA || '[[:alnum:]]') >2
相关问题