提取复杂的文本模式我需要提取文本模式看起来像这样:使用SQL函数
NN-NNN-NNNNNNNNN
(2digit,minus, 3digits,minus,9digits)
沿文本字段。例如,具体字段如下所示:
"fsadlk fasldkl jhkjfd khjfasd 11-333-878787618 hfsd uhjkfads"
我需要在选择行中使用sql函数提取11-333-878787618。我正在使用DB2 AS400,但任何SQL函数语法都会有所帮助。
提取复杂的文本模式我需要提取文本模式看起来像这样:使用SQL函数
NN-NNN-NNNNNNNNN
(2digit,minus, 3digits,minus,9digits)
沿文本字段。例如,具体字段如下所示:
"fsadlk fasldkl jhkjfd khjfasd 11-333-878787618 hfsd uhjkfads"
我需要在选择行中使用sql函数提取11-333-878787618。我正在使用DB2 AS400,但任何SQL函数语法都会有所帮助。
以下内容在这方面可能有用;我可以添加提取为好,但我想,可能已经了解,得到这个地步后:
create table patterns (p varchar(65), find_at smallint)
;
insert into patterns values
('fsadlk fasldkl jhkjfd khjfasd 11-333-878787618 hfsd uhjkfads',31)
,('weroiu 11-333-8787zz618 oiuwens snkdl osjlwhe' ,00)
,('nm,sdj xhdgweufyen sndh 711-333-878787618 hfsd uhjkfads' ,26)
,('nm,sdj xhdgweufyen sndh 11-333-8787876187 hfsd uhjkfads' ,25)
-- ....+....1....+....2....+....3....+....4....+....5....+....6.
;
select translate(p, '9', '', '9') as translated
, smallint(locate('99-999-999999999'
, translate(p, '9', '', '9'))
) as located
, find_at
from patterns
; -- report from the above query follows:
TRANSLATED LOCATED FIND_AT
fsadlk fasldkl jhkjfd khjfasd 99-999-999999999 hfsd uhjkfads 31 31
weroiu 99-999-9999zz999 oiuwens snkdl osjlwhe 0 0
nm,sdj xhdgweufyen sndh 999-999-999999999 hfsd uhjkfads 26 26
nm,sdj xhdgweufyen sndh 99-999-9999999999 hfsd uhjkfads 25 25
Works令人惊叹!非常感谢你! –
没有内置的SQL函数来为您提供您正在尝试完成的任务。我建议你看看this。这是一篇关于如何使用用户定义函数在iSeries DB2 SQL上执行正则表达式的IBM文章。然后正则表达式匹配的文本是:
\d\d-\d\d\d-\d\d\d\d\d\d\d\d\d
这将是很好用的适当正则表达式模式:
\d{2}-\d{3}-\d{9}
但是,IBM实现是相当有限的这个表达式功能。
根据此处的文档https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/db2/rbafzregexp_like.htm,{n}修饰符应至少在v7.1及更高版本上运行。真正的警告是必须安装Unicode的国际组件。我没有安装在这里,所以我无法测试这个。您正在查找的DB2函数是“REGEXP_LIKE”。 – jmarkmurphy
如果您正在为IBM i寻找ICU,那么它是操作系统的选项39。 – jmarkmurphy
非常感谢!正则表达式非常强大,虽然我无法在我的iSerious SQL环境中运行它 –
请标记与您正在使用的数据库你的问题。另外,编辑问题并提供样本数据和期望的结果。 –
还要添加一些示例表格数据和预期结果。 – jarlh