2011-07-07 7 views
0

指定された文字列が 'abcd efg -4'、つまり '%-number'の形式であるかどうかを判断する必要があります。私は '4'を分離し、それを '5'に増やす必要があります。T-SQLパターンマッチの問題

文字列の残りの部分がそうのように日付と時刻を含めることができます。

ABCD EFG - GHIS asdjh - 2011年7月7日05-30-34 AM

この文字列、のためにインスタンスは、パターンie - [number]を満たしません。上記入力された場合は、私がすべき、2011年7月7日05-30-34 AM -1

- GHIS asdjh - この文字列のために、私のSQLからの出力は

ABCD EFGする必要があります取得:

ABCD EFGを - GHIS asdjh - 2011年7月7日05-30-34 AM -2

数はそれほど文字列は「ABCD EFGことができ桁すなわち、任意の数のことができます-123 '、私のT- SQLは 'abcd efg -124'を返します

このT-SQLコードはストアドプロシージャに埋め込まれます。私は、.NETのproc /関数を実装し、これを行うRegexを実装することができますが、SQL ServerのCLRをオンに切り替えるためには、さまざまなアクセスの問題があります。

私は以下のパターンを試してみました:

  • '%[] [ - ]%[0-9]'、これはほとんどの場合のために動作しますが、どこかに余分なスペースに入れて、それが
  • に失敗上記の例のように '-4'をスキップしますが、いくつかのケースでは、のように動作します(この例では、
  • '%[] [ - ]%[^ az] [^ AZ]%[0-9]
  • '%[] [ - ] [^ AZ] [^ AZ]%[0-9]'、これは再びいくつかで動作し、...

このパターン他人にはしません - [麻痺するer] 'は常に文字列の最後にあります。存在しない場合は、上の例に示すように、コードがそれを追加します。

すべての場合に有効なパターンを希望します。

+0

文字列は 'abcd efg -4 07-07-2011'のように見えます。この場合、出力は 'abcd efg -5 07-07-2011'です。しかし、文字列は 'abcd efg - 07-07-2011'のように見えるかもしれません。その場合、 'abcd efg-07-07-2011 -1'が返されますか?私はそれを正しく理解していますか? – billinkc

+0

- [番号]またはより正確にパターンは次のようになり「からは」常に文字列の末尾になります... – Hasanain

答えて

0

興味深い問題です。あなたはこれが本当に必要なものよりはるかに難しいことを理解しています。各列に1つの情報のみが含まれるようにテーブルを適切に正規化しても、まったく問題はありません。可能であれば、このデータを正規化することを強くお勧めします。

データを正規化できない場合は、私はこれを逆にします。あなたはあなたが探しているダッシュナンバーはいつもデータの終わりに現れると言いました。文字列を逆にして解析して戻してみましょう。文字列を逆にすると、 '[0-9]%[ - ]'を探すことができます。これは見つけるのがずっと簡単です。

テーブル変数にテストデータを入れて、私が思いついたコードをテストできるようにしました。これをクエリウィンドウにコピーして貼り付けると、その動作を確認できます。

Declare @Temp Table(Data VarChar(100)) 

Insert Into @Temp Values('abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM') 
Insert Into @Temp Values('abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM -1') 
Insert Into @Temp Values('abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM -2') 
Insert Into @Temp Values('abcd efg -123') 

Select Case When PatIndex('[0-9]%[-]%', Reverse(Data)) = 1 
      Then Left(Data, Len(Data)-CharIndex('-', Reverse(Data))) + '-' + 
       Convert(VarChar(20), 1+Convert(Int, Reverse(Left(Reverse(Data), CharIndex('-', Reverse(Data))-1)))) 
      Else Data + ' -1' 
      End 
From @Temp 
+0

はええ、私はそれを実現しています。あなたの解決策は...私の例で最も感謝のために働いている – Hasanain

+0

また、問題は、この文字列は、アプリケーションから来て、その後、このDB手順...と、この同じ手順に提出される前に、ユーザが変更することができるということですDB内の他のプロシージャから呼び出すことができます。 – Hasanain