2017-09-25 10 views
0

SQLServer Management Studioの文字列からシリアル番号を取得する信頼性の高い方法を見つけるのが難しいです。などiPad2 Black DMPJ491PDVD1 smart case、または16BG SF4KNK6BKG5D9TSQL - 文字列からシリアル番号を引き出します。おそらく正規表現ですか?

、大文字や数字をされている行の10+の文字を探しているようなものをやって扱うことができないLIKE句のように思える(https://docs.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql)を見ると、そのようなものがある場合それらの文字をすべて見つけた

これはSQL/T-SQLで実行できますか?私はSQLServer 2008を使用しています。

+0

あなたは、あなたが対と一致するようにしようとしているものを区別する一連のルールを記述することができて、このような何かのために正規表現を使用することができますあなたが一致させようとしていないもの。まず、これらの通し番号は常に大文字と数字で構成されていると言っても過言ではないでしょうか?彼らはいつも少なくとも2文字で始まり数字で終わるのですか?彼らは決して入力に空白以外の文字の最初のグループとして位置付けられませんか? – CAustin

答えて

1

ここでは、インライン分割アプローチがあります。

Declare @YourTable Table ([ID] int,[SomeCol] varchar(50)) 
Insert Into @YourTable Values 
(1,'iPad2 Black DMPJ491PDVD1 smart case') 
,(2,'16BG SF4KNK6BKG5D9 SF4KNK6BKG5D9') 

Select A.* 
     ,SN = B.RetVal 
From @YourTable A 
Cross Apply (
       Select Distinct RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
       From (Select x = Cast('<x>' + replace((Select replace(A.SomeCol,' ','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
       Cross Apply x.nodes('x') AS B(i) 
      ) B 
Where Len(RetVal)>=10 
    and patindex('%[0-9]%',RetVal)>0 

戻り

ID SomeCol        SN 
1 iPad2 Black DMPJ491PDVD1 smart case DMPJ491PDVD1 
2 16BG SF4KNK6BKG5D9     SF4KNK6BKG5D9 
+0

私はこの仕組みがまだ分かりませんが、私はこれを既存のコードに実装しようとしています。少し時間がかかるかもしれませんが、1日かそれ以上の質問があればお知らせします。 –

+0

@ Jeff.Clark部品を見るとそれほど複雑ではありません。 xml部分は、文字列をスペースの区切り文字で分割しています。 §§Split§を使用するこの技術は、XML文字を解析することを可能にします。そして、CROSS APPLYはあなたに快適な時間を与える価値があります。 –

+0

この状況の一部は、データベース上のいくつかのデータ入力エラーです。シリアル番号のいくつかはそのフィールドに複数回入力され、余分なレコードが発生します。私は今、それをどのように制限するかを考えようとしています。 –

関連する問題