使用SQL函数提取复杂的文本模式

时间:2016-08-05 11:28:53

标签: sql ibm-midrange db2-400 textpattern

我需要提取一个看起来像这样的文本模式:

NN-NNN-NNNNNNNNN 
(2digit,minus, 3digits,minus,9digits)

来自文本字段。例如,特定字段如下所示:

"fsadlk fasldkl jhkjfd khjfasd 11-333-878787618 hfsd uhjkfads"

我需要在选择行11-333-878787618中使用sql函数提取。我正在使用DB2 AS400,但任何SQL函数语法都会有所帮助。

2 个答案:

答案 0 :(得分: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 :(得分: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', '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