在SQL Server 2016中删除开头或结尾的CR LF,制表符和空格

时间:2019-07-16 18:11:28

标签: sql sql-server

我有一个名为PRODUCTS的表,该表具有500条记录,在一个称为SHORT_DESCRIPTION的字段中,字符串的开头或结尾可能包含CR LF,制表符或空白。

我想删除字符串开头或结尾(而不是中间)中的所有CR LF字符,所有制表符和所有空格。

对于空白,我可以这样做:

UPDATE PRODUCTS set SHORT_DESCRIPTION = RTRIM(LTRIM(SHORT_DESCRIPTION))

或者我可以对CL RF使用replace,但是如何仅在开始或结束时进行替换?

1 个答案:

答案 0 :(得分:2)

LTRIMRTRIM仅删除开头/结尾的空格,而不删除其他任何字符

使用STUFFPATINDEX之类的东西,从一开始就很容易地删除字符。因此,您可以执行以下操作:

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

DB<>Fiddle