【问题标题】:How to return a substring after a colon and before a whitespace in Oracle SQL如何在 Oracle SQL 中的冒号之后和空格之前返回子字符串
【发布时间】:2019-11-08 00:29:49
【问题描述】:

我需要从冒号之后和空格之前的表列中获取子字符串。子字符串的长度可以变化,但冒号之前和空格之后的数据长度是恒定的。

因此,我的表格列中名为“主题”的数据由 5 个单词组成,紧随其后的是一个冒号,紧随其后的是我需要的子字符串(长度可能不同),然后是一个空格和一个日期。我需要的子字符串是课程名称。示例:

即将到来的课程到期付款:FIN/370T 11/26/2019

即将到来的课程的付款到期:BUS/475 11/26/2019

即将到来的课程的付款到期:ADMIN9/475TG 11/26/2019

我尝试使用 REGEXP 函数和 REGEXP_SUBSTR(COLUMN_NAME,'[^:]+$') 来获取冒号之后的所有内容,并使用 REGEXP_SUBSTR(COLUMN_NAME, '[^ ]+' , 1 , 5 ) 来获取之前的数据最后一个空格,但我需要将它们组合起来。

我尝试了以下方法:

  select 
       REGEXP_SUBSTR(SUBJECT,'[^:]+$')  COURSE_ID

  from TABLE


  Result:
  FIN/370T 11/26/2019

还有这个:

  select 
       REGEXP_SUBSTR (SUBJECT, '[^ ]+' , 1 , 5 ) COURSE_ID2          

  from TABLE

  Result: 
  Course:FIN/370T

我需要输出返回 FIN/370T

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    简而言之:

    select regexp_replace(str,'(.*:)(.*)( )(.*)$','\2') as short_course_id
      from tab
    

    我更喜欢regexp_replace,因为提取部分字符串的可能性更大。

    【讨论】:

      【解决方案2】:

      如果你不想弄乱正则表达式,你可以使用 substr 和 instr 的组合。

      select
      substr(part1,1,instr(part1, ' ',-1,1) ) as course,
      part1
      from (
      select
      substr(<your column>,instr(<your column>,':',1,1) +1) as part1
      from
      <your table>
        ) t
      

      Fiddle

      【讨论】:

        【解决方案3】:

        一个选项是

        select replace(regexp_substr(str,'[^:]+$'),
                       regexp_substr(str,'[^:][^ ]+$'),'') as course_id
          from tab
        

        Demo

        其中第一个regexp_substr() 提取从冒号开始到末尾的子字符串,第二个从最后一个空格到末尾。

        【讨论】:

        • 我会使用 regexp_replace(str,'(.*:)(.*)( )(.*)$','\2') 作为 short_course_id
        • yors 更好 @ThomasSrub 转换为答案。
        猜你喜欢
        • 2021-01-28
        • 2015-09-03
        • 2019-10-13
        • 2015-03-22
        • 2012-02-10
        • 1970-01-01
        • 2017-11-29
        • 2023-01-10
        • 1970-01-01
        相关资源
        最近更新 更多