我有一个名为PRODUCTS的表,该表具有500条记录,在一个称为SHORT_DESCRIPTION的字段中,字符串的开头或结尾可能包含CR LF,制表符或空白。
我想删除字符串开头或结尾(而不是中间)中的所有CR LF字符,所有制表符和所有空格。
对于空白,我可以这样做:
UPDATE PRODUCTS set SHORT_DESCRIPTION = RTRIM(LTRIM(SHORT_DESCRIPTION))
或者我可以对CL RF使用replace,但是如何仅在开始或结束时进行替换?
答案 0 :(得分:2)
LTRIM
和RTRIM
仅删除开头/结尾的空格,而不删除其他任何字符
使用STUFF
和PATINDEX
之类的东西,从一开始就很容易地删除字符。因此,您可以执行以下操作:
DECLARE @Pattern varchar(15) = '%[^' + Char(9) + CHAR(10) + CHAR(13) + CHAR(32) + ']%'; --Tab, Line Break, Carriage Return, and White Space
SELECT STUFF(YourString,1,ISNULL(NULLIF(PATINDEX(@Pattern,YourString),0)-1,0),'');
上面的代码找到了要删除的第一个字符(PATINDEX
)中第一个不是 的字符,然后删除了所有前面的字符({{1 }})。
从头开始删除它们可能很容易,但更昂贵;因为它需要STUFF
。因此,您可能会得到如下最终声明:
REVERSE
如果愿意,可以通过创建函数来使其更容易阅读:
CREATE TABLE YourTable (YourString varchar(100));
INSERT INTO YourTable
VALUES(CHAR(13) + CHAR(10) + ' asdghjkfsduif78 8971234t j57y12340' + CHAR(13) + CHAR(10) +
N'Test'+ Char(9) + 'Data' + CHAR(13) + CHAR(10) +
N'A value'+ Char(9) + '7'+ Char(9) + ' ' + CHAR(10))
DECLARE @Pattern varchar(15) = '%[^' + Char(9) + CHAR(10) + CHAR(13) + CHAR(32) + ']%'; --Tab, Line Break, Carriage Return, and White Space
SELECT R.NewString, YT.YourString,
DATALENGTH(R.NewString), DATALENGTH(YT.YourString)
FROM YourTable YT
CROSS APPLY (VALUES(STUFF(YT.YourString,1,ISNULL(NULLIF(PATINDEX(@Pattern,YT.YourString),0)-1,0),'')))L(NewString)
CROSS APPLY (VALUES(REVERSE(STUFF(REVERSE(L.NewString),1,ISNULL(NULLIF(PATINDEX(@Pattern,REVERSE(L.NewString)),0)-1,0),''))))R(NewString)
GO
DROP TABLE YourTable;
然后您可以使用如下功能:
CREATE FUNCTION StripLeadingCharacters_tvf (@InputString varchar(8000), @StripCharacters varchar(128))
RETURNS TABLE
AS RETURN
SELECT STUFF(@InputString,1,ISNULL(NULLIF(PATINDEX('%[^' + @StripCharacters + ']%',@InputString),0)-1,0),'') AS StrippedString