2016-05-23 80 views
0

我有一個表,其中有一個字段的行爲像一個數組,用於某些前端處理,並且是連接來自不同平坦表的9列的結果。該字段被填充爲這樣在SQL Server中刪除多個尾隨字符 - Oracle相當於修剪(尾隨)

字段1 + '' +字段2 + '' +字段3 + '' +字段4 + '' +字段5 + '' +字段6 + '' +字段7 + ','+ Field8 +','+ Field9

如果Flat4中的Field4有一個值,那麼Fields1,2和3也有一個值。但是,大部分時間場5 - 9沒有價值。其結果是,在陣列場(串聯之後)最值是這樣的:

鮑勃,喬,瑪麗,山姆,,,,,

我正在尋找一種簡單的方法更新此串聯領域,而不是像這樣:

Bob,Joe,Mary,Sam 

這是Oracle相當於Trim(Trailing',' From FieldValue)

回答

0

創建以下UDF:

CREATE FUNCTION Trailing(@String VarChar(Max), @Char VarChar(5)) 
RETURNS VarChar(Max) 
BEGIN 
    RETURN 
     Reverse(
     SubString(
     Reverse(@String) 
     ,PatIndex('%[^' + @Char + ' ]%',Reverse(@String)) 
     ,DataLength(@String) 
     ) 
     ) 
END 
GO 

給它一個測試驅動器:

SELECT 
    'Array_Value_1,Array_Value_2,Array_Value_3,,,,,' AS Original_String, 
    dbo.Trailing('Array_Value_1,Array_Value_2,Array_Value_3,,,,,', ',') AS Clean_String 
GO 
+0

個人而言,我不會扭轉串三次。你需要做一次,但你可以通過從長度中減去patindex來計算你需要的字符串的位。 –

1

如果你只是這樣做:

SELECT REPLACE(@str, ',,', ''); 

你將留下一個字符串1個或0逗號結尾,這取決於關於是否存在偶數或奇數的尾隨逗號。

你可以用SUBSTRING或者LEFT結構來包裝這個結構,如果它是一個逗號,它就會刪除最後一個字符。

3

我會反向走,找到的第一個非逗號字符,然後使用連同LEN()和LEFT()

DECLARE @string VARCHAR(200) = 'Bob,Joe,Mary,Sam,,,,,' 

SELECT LEFT(@string, LEN(@string) - PATINDEX('%[^,]%', REVERSE(@string))+1) 
+0

- 這很酷,但對以下內容失敗: DECLARE @string VARCHAR(200)='Bob1,Joe2,Mary3,Sam4 ,,,,,' SELECT LEFT(@string,LEN(@string) - PATINDEX ('%[AZ]%',REVERSE(@string))+ 1) –

+0

它已被修復。 –

+0

感謝Martin的建議,代碼已更新以查找第一個非逗號字符。 – dfundako