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