2016-08-05 3 views
-2

を使用して、複雑なテキストパターンを抽出し、私はこのように見ているテキストパターンを抽出する必要があります。テキストフィールドに沿ってからは、SQL関数

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

が使用しているデータベースであなたの質問にタグを付けてください。また、質問を編集し、サンプルデータと希望の結果を提供します。 –

+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

素晴らしい作品!どうもありがとうございました! –

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

BTW IBM iのICUをお探しの場合は、オペレーティング・システムのオプション39です。 – jmarkmurphy

+0

ありがとうございました!私は私の真のSQL環境でそれを実行することはできませんでしたが、正規表現は非常に強力です –