使用 SQL 函数提取复杂的文本模式
Extract complex text pattern using SQL function
我需要提取如下所示的文本模式:
NN-NNN-NNNNNNNNN
(2digit,minus, 3digits,minus,9digits)
来自文本字段。例如,特定字段如下所示:
"fsadlk fasldkl jhkjfd khjfasd 11-333-878787618 hfsd uhjkfads"
我需要使用 select 行中的 sql 函数提取 11-333-878787618。我正在使用 DB2 AS400,但任何 SQL 函数语法都会有所帮助。
没有内置的 SQL 功能可以为您提供您想要完成的功能。我建议你看看 this。这是一篇关于如何使用用户定义函数在 iSeries DB2 SQL 上执行正则表达式的 IBM post。然后匹配文本的正则表达式模式将是:
\d\d-\d\d\d-\d\d\d\d\d\d\d\d\d
最好使用以下正则表达式模式:
\d{2}-\d{3}-\d{9}
但是IBM实现的这个正则表达式功能比较有限
以下内容可能对这方面有用;我也可以添加 extraction,但我想这可能已经被理解了,在走到这一步之后:
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', '0123456789', '9') as translated
, smallint( locate( '99-999-999999999'
, translate(p, '9', '0123456789', '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
我需要提取如下所示的文本模式:
NN-NNN-NNNNNNNNN
(2digit,minus, 3digits,minus,9digits)
来自文本字段。例如,特定字段如下所示:
"fsadlk fasldkl jhkjfd khjfasd 11-333-878787618 hfsd uhjkfads"
我需要使用 select 行中的 sql 函数提取 11-333-878787618。我正在使用 DB2 AS400,但任何 SQL 函数语法都会有所帮助。
没有内置的 SQL 功能可以为您提供您想要完成的功能。我建议你看看 this。这是一篇关于如何使用用户定义函数在 iSeries DB2 SQL 上执行正则表达式的 IBM post。然后匹配文本的正则表达式模式将是:
\d\d-\d\d\d-\d\d\d\d\d\d\d\d\d
最好使用以下正则表达式模式:
\d{2}-\d{3}-\d{9}
但是IBM实现的这个正则表达式功能比较有限
以下内容可能对这方面有用;我也可以添加 extraction,但我想这可能已经被理解了,在走到这一步之后:
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', '0123456789', '9') as translated
, smallint( locate( '99-999-999999999'
, translate(p, '9', '0123456789', '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