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