oracle sql中的regexp_substr

Posted

技术标签:

【中文标题】oracle sql中的regexp_substr【英文标题】:Regex_subtr in oracle sql 【发布时间】:2021-02-26 23:47:51 【问题描述】:

我碰壁了。我需要从下面的文本中提取 from: Date 和 To: Date。 它总是以日期开头。但是从:更改为:有时可以是 [none] 而不是日期模式。

列:

"31-Jul-2017 11:29 (GMT+1:00) Date Due was modified by: placeholder, SNO-1234.

**Changed from: 12-Dec-2017**

**Changed to: 01-Jan-2021**

Meaning: Initial Entry 
Meaning Comments:"

想要的输出:

Column = From: "12-Dec-2017"       
Column = Changed To: "01-Jan-2021"

我试过了

cast(regexp_substr(column:, 'from:\s.*') as varchar(17)) as "From:",

cast(regexp_substr(column:, 'to:\s.*') as varchar(15)) as "Changed To:"

我最终得到..

Column = From: "**From:** 12-Dec-2017"                     
Column = Changed To: "**To:** 01-Jan-2021"
   

无论如何要排除 from: 和 to: ?所以基本上,我怎样才能只得到“from:”和“to:”之后的 11 个字符。

提前致谢!

\光辉之水

【问题讨论】:

【参考方案1】:

你不需要正则表达式,你可以使用简单的字符串函数:

SELECT CASE 
       WHEN from_pos > 0
       THEN TO_DATE(
              SUBSTR( value, from_pos + 14, 11 )
              DEFAULT NULL ON CONVERSION ERROR,
              'DD-MON-YYYY'
            )
       END AS from_dt,
       CASE
       WHEN to_pos > 0
       THEN TO_DATE(
              SUBSTR( value, to_pos + 12, 11 )
              DEFAULT NULL ON CONVERSION ERROR,
              'DD-MON-YYYY'
            )
       END AS to_dt
FROM   (
  SELECT value,
         INSTR( LOWER( value ), 'changed from: ', 1, 1 ) AS from_pos,
         INSTR( LOWER( value ), 'changed to: ', 1, 1 ) AS to_pos
  FROM   table_name
);

但是,如果您确实想使用(较慢的)正则表达式,那么您可以使用:

SELECT TO_DATE(
         REGEXP_SUBSTR(
           value,
           'changed from:\s*(([012]\d|3[01])-(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)-\d4)',
           1,
           1,
           'i',
           1
         )
         DEFAULT NULL ON CONVERSION ERROR,
         'DD-MON-YYYY'
       ) AS from_dt,
       TO_DATE(
         REGEXP_SUBSTR(
           value,
           'changed to:\s*(([012]\d|3[01])-(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)-\d4)',
           1,
           1,
           'i',
           1
         )
         DEFAULT NULL ON CONVERSION ERROR,
         'DD-MON-YYYY'
       ) AS to_dt
FROM   table_name;

其中,对于您的示例数据:

CREATE TABLE table_name ( value ) AS
SELECT '31-Jul-2017 11:29 (GMT+1:00) Date Due was modified by: placeholder, SNO-1234.
Changed from: 12-Dec-2017
Changed to: 01-Jan-2021
Meaning: Initial Entry Meaning Comments:' FROM DUAL

两个输出:

FROM_DT | TO_DT :----------------- | :----------------- 2017-12-12T00:00:00 | 2021-01-01T00:00:00

db小提琴here

【讨论】:

谢谢!我在实现字符串函数时遇到了一些问题,因为它无法识别 from 语句。我将“值”与包含要解析的文本的列和 table_name 与原始 from 语句交换,但它给了我一些)错误或无法识别这些列。在原始 from 语句中,我有 1 个表和 2 个左连接。

以上是关于oracle sql中的regexp_substr的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Oracle中的SQL中的REGEXP_SUBSTR将自定义消息替换为空插槽

Oracle SQL:带有 REGEXP_SUBSTR 表达式的插入查询很长(拆分字符串)

Oracle 正则表达式函数-REGEXP_SUBSTR 使用例子

Oracle SQL 正则表达式 RegExp_SubStr End Of Line (chr(10) 在搜索文本中返回 null

Oracle 字符串转多行(REGEXP_SUBSTR)

截取ORACLE字符串中的数字