Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用正则表达式提取SQL中的字符串部分_Regex_Oracle - Fatal编程技术网

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

Regex 使用正则表达式提取SQL中的字符串部分,regex,oracle,Regex,Oracle,大家好 我有一个关于SQL中正则表达式的查询 我有一个例子,字符串的一部分必须从列中提取。该列的部分将以我的A列作为前缀。请查看示例数据的屏幕截图。我还在一个单独的列中添加了预期的输出(以绿色突出显示) 场景: 现在,如果一个列值有超过1个唯一的数字,那么必须以Null显示 例如:在批准后验证CAN06010025,CAN06010026和CAN06010030 在上面的字符串中,我有多个数字(粗体部分) 这种情况应该被忽略(这意味着它必须给我空值) 如果只有一个数字,如果它是重复的,那么我必须

大家好

我有一个关于SQL中正则表达式的查询

我有一个例子,字符串的一部分必须从列中提取。该列的部分将以我的A列作为前缀。请查看示例数据的屏幕截图。我还在一个单独的列中添加了预期的输出(以绿色突出显示)

场景:

  • 现在,如果一个列值有超过1个唯一的数字,那么必须以Null显示 例如:在批准后验证CAN06010025CAN06010026CAN06010030
  • 在上面的字符串中,我有多个数字(粗体部分) 这种情况应该被忽略(这意味着它必须给我空值)

  • 如果只有一个数字,如果它是重复的,那么我必须考虑该情况并提取字符串的一部分。 例如:项目USA12:IdUSA12S001:需要联系-USA12S001-表格待更新
  • 在这个例子中,我想提取的部分是重复的,我希望只提取突出显示的部分

    其他情况也是如此

    我尝试使用下面的sql。挑战在于我的A列也可能出现在B列(屏幕截图中的第2行),当我使用REGEXP_count函数计数时,这段代码将我的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

    美国12

    USA27

    HUN04

    CAN05

    USA24

    CAN06


    列B

    在批准后验证CAN06010025、CAN06010026和CAN06010030

    项目USA12:Id USA12S001:需要联系-USA12S001-待更新表格

    项目USA27:Id:USA27S001:Prod

    在到期日后查看id HUN04S002-HUN04S004

    ID:CAN05S005,详细信息如CAN05S005已完成

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


    “Project:Subject CAN06S009:V2&V3-Id CAN06S010:V1”

    如果
    REGEXP\u计数是唯一的问题,那么答案很简单:更改

    case when REGEXP_COUNT(ColB,ColA) >2
    
    致:


    感谢您的关注,Tim,我正在使用Oracle来实现这一点。请将测试数据作为文本而不是图像发布-我无法复制您的图像并将其粘贴到我的SQL编辑器中。
    case when REGEXP_COUNT(ColB,ColA || '[[:alnum:]]') >2