2016-08-05 53 views
-2

提取复杂的文本模式我需要提取文本模式看起来像这样:使用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函数语法都会有所帮助。

+2

请标记与您正在使用的数据库你的问题。另外,编辑问题并提供样本数据和期望的结果。 –

+1

还要添加一些示例表格数据和预期结果。 – jarlh

回答

1

以下内容在这方面可能有用;我可以添加提取为好,但我想,可能已经了解,得到这个地步后:

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 
+0

Works令人惊叹!非常感谢你! –

1

没有内置的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实现是相当有限的这个表达式功能。

+1

根据此处的文档https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/db2/rbafzregexp_like.htm,{n}修饰符应至少在v7.1及更高版本上运行。真正的警告是必须安装Unicode的国际组件。我没有安装在这里,所以我无法测试这个。您正在查找的DB2函数是“REGEXP_LIKE”。 – jmarkmurphy

+0

如果您正在为IBM i寻找ICU,那么它是操作系统的选项39。 – jmarkmurphy

+0

非常感谢!正则表达式非常强大,虽然我无法在我的iSerious SQL环境中运行它 –