2011-07-07 72 views
0

我需要確定給定的字符串是否爲'abcd efg -4'格式,即'% - 數字'。我需要隔離'4',並將其增加到'5'。T-SQL模式匹配問題

字符串的其餘部分可以包含日期和時間,像這樣:

ABCD EFG - ghis asdjh - 07-07-2011 34年5月30日上午

這個字符串,實例,不符合模式即 - [數字]。對於這個字符串,從我的SQL輸出應該是

ABCD EFG - ghis asdjh - 07-07-2011 34年5月30日上午-1

如果上面的輸入,我應該得到:

ABCD EFG - ghis asdjh - 07-07-2011 34年5月30日上午-2

的數量可以是任何數量的數字,即這樣一個字符串可以爲「ABCD EFG -123'和我的T- SQL將返回'abcd efg -124'

此T-SQL代碼將被嵌入到存儲過程中。我知道我可以實現一個.Net存儲過程/函數,並使用Regex來做到這一點,但是爲了打開SQL Server上的CLR,我必須解決各種訪問問題。

我曾嘗試以下方式:

  • '%[] [ - ]%[0-9]',這適用於大多數情況,但放在一個額外的空間某處,也未能
  • '%[] [ - ]%[^ az] [^ AZ]%[0-9]',它設法跳過'-4'(如上例所示),但在多種情況下有效,如
  • '%[] [ - ] [^ AZ] [^ AZ]%[0-9]',這在某些再次工作,不會在別人...

這種模式' - [麻木呃]'總是在字符串的末尾,如果它不存在,代碼將會附加它,如上面的例子所示。

我想要一種適用於所有情況的圖案...

+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

有趣的問題。你意識到這比實際需要的困難得多。如果您正確地對錶格進行了規範化處理,以便每列只包含一條信息,那麼根本沒有問題。如果可能的話,我強烈建議您考慮對這些數據進行規範化處理。

如果你不能規範化數據,那麼我會後退。你說你正在尋找的破折號一直會出現在數據的末尾。爲什麼不反轉這個字符串,解析它,然後把它放回去。通過反轉字符串,您將查找'[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

此外,問題是這個字符串來自應用程序,並可以在提交給這個數據庫隨後的過程...之前由用戶修改...和這個相同的程序可以通過數據庫中的其他程序調用。 – Hasanain