如何使用sql从varchar2(4000)多行字符串中提取多个日期?

时间:2016-06-20 22:14:15

标签: sql regex plsql oracle11g

我在原始表格中有两列ID (NUMBER)DESCRIPTION (VARCHAR2(4000))

DESCRIPTION列有多行字符串。

我需要从字符串的每一行中提取日期,还需要找到最早的日期。所以结果看起来像预期的结果表。

原创结果:
Origional result

预期表:
Expected Table 使用此查询:

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:;

,但不是来自其他两个。

1 个答案:

答案 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匹配。