我在原始表格中有两列ID (NUMBER)
,DESCRIPTION (VARCHAR2(4000))
DESCRIPTION
列有多行字符串。
我需要从字符串的每一行中提取日期,还需要找到最早的日期。所以结果看起来像预期的结果表。
to_date((regexp_substr(A.Description , '\d{1,2}/\d{1,2}/\d{4}')), 'MM-DD-YYYY')
我能够从第一行提取日期
Discontinued:09/10/2015:Rappaport Family Institute for Research:;
,但不是来自其他两个。
答案 0 :(得分:1)
好吧,我想我找到了一个类似于其他帖子的解决方案,但更简单。仅供参考。 regexp_substr()函数只返回一个匹配项。这是一个带有嵌入式换行符的字符串的示例(实际上并不重要,但添加以显示它将在这种情况下起作用):
WITH A AS
(SELECT 'this is a test:12/01/2015 01/05/2018'
|| chr(13)
||chr(10)
|| ' this is the 2nd line: 07/07/2017' Description
FROM dual
)
SELECT to_date(regexp_substr(A.Description , '\d{1,2}/\d{1,2}/\d{4}',1,level),'MM/DD/YYYY')
FROM A
CONNECT BY level <= regexp_count(a.description, '\d{1,2}/\d{1,2}/\d{4}')
输出:
12/01/2015
01/05/2018
07/07/2017
如果您不熟悉oracle中的分层查询,&#34; level&#34;是一个伪列。通过在regexp_substr函数中使用它作为第3个参数(出现),每个&#34;级别&#34;将在先前找到的子字符串之后开始模式匹配。 regexp_count将计算模式匹配的#times,因此我们继续解析sting,移动一次,直到达到max #of匹配。