Sql Regexp\u Substr问题
我必须解析一个notes字段,其中包含一些非常糟糕的字符,我需要从一些内部术语中提取一个日期 基本上字段是这样的,这是4个不同的注释,我只想从中提取日期:Sql Regexp\u Substr问题,sql,regex,oracle,Sql,Regex,Oracle,我必须解析一个notes字段,其中包含一些非常糟糕的字符,我需要从一些内部术语中提取一个日期 基本上字段是这样的,这是4个不同的注释,我只想从中提取日期: Ltr Cert Expires ****01/15/17*** Ltr Cert Expires ***01/5/2010*** Ltr Cert Expires **01/10/11*** Ltr Cert Expires *******01/15/01*** 我对regexp_substr不是非常熟悉,但我在这里翻了一下,没有
Ltr Cert Expires ****01/15/17***
Ltr Cert Expires ***01/5/2010***
Ltr Cert Expires **01/10/11***
Ltr Cert Expires *******01/15/01***
我对regexp_substr不是非常熟悉,但我在这里翻了一下,没有看到很多符合我所寻找的示例
有什么想法吗?也许有人建议阅读Oracle的Regexp?我对这项功能非常陌生,代码有时有点让人困惑。这可能是一种非常不言自明的方式 它查找一个由一个或两个数字组成的序列(
[0-9]{1,2}
),后跟一个“/”(\/
)等等
可以用许多不同、更紧凑或更尖锐的方式重新编写,例如,检查内容是否确实表示日期,但如果您假设每一行(与示例数据一样)始终以示例数据的一种格式包含恰好一个日期,这就足够了:
with test(t) as (
select 'Ltr Cert Expires ****01/15/17***' from dual union all
select 'Ltr Cert Expires ***01/5/2010***' from dual union all
select 'Ltr Cert Expires **01/10/11***' from dual union all
select 'Ltr Cert Expires *******01/15/01***' from dual
)
select regexp_substr(t, '[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{2,4}')
from test
给出:
01/15/17
01/5/2010
01/10/11
01/15/01
仅举一个不同方法的例子,以下数据给出了相同的结果:
regexp_substr(t, '([^\*]+)', 1, 2)
这将搜索至少一个与'*'
不同的字符序列,但返回第二个匹配项(第四个参数的值为2
)。第一次出现在第一个'*'
之前,因此第二次出现在'*'
的第一个和第二个序列之间的字符串部分
在本例中,这将返回您拥有的任何字符串,无论它是否是日期
这个
给出:
STR1 STR2
---------- ------------------------------
01/15/17 01/15/17
01/5/2010 01/5/2010
01/10/11 01/10/11
01/15/01 01/15/01
Not a date, but ...
非常感谢-我一直在试图找出如何按字符搜索,也许是找到星星后面的东西,但我并没有真正考虑只搜索数字并匹配1和2个匹配项。@JordanHaymond:只是展示了一种不同的方式,只是为了解释
STR1 STR2
---------- ------------------------------
01/15/17 01/15/17
01/5/2010 01/5/2010
01/10/11 01/10/11
01/15/01 01/15/01
Not a date, but ...