SQL仅删除前导或尾随回车

dyn*_*ous 21 sql t-sql sql-server string

我傻眼了,这个问题还没有被有意义地问过.如何在SQL中创建等效函数,LTRIM或仅RTRIM用于回车和换行,仅在字符串的开头或结尾处.

显然REPLACE(REPLACE(@MyString,char(10),''),char(13),'')删除所有回车和新换行.这不是我想要的.我只是想删除前导或尾随的.

Ano*_*non 27

找到第一个不是 CHAR(13)CHAR(10)从字符串长度中减去其位置的字符.

LTRIM()

SELECT RIGHT(@MyString,LEN(@MyString)-PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%',@MyString)+1)
Run Code Online (Sandbox Code Playgroud)

RTRIM()

SELECT LEFT(@MyString,LEN(@MyString)-PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%',REVERSE(@MyString))+1)
Run Code Online (Sandbox Code Playgroud)

  • 这很好,但如果字符串仅包含 CRLF 字符,则会失败。在这种情况下,PATINDEX 返回 0,因此返回整个字符串。 (2认同)

sql*_*ser 10

以下功能是trim您可以使用的增强型功能.复制自sqlauthority.com

这些函数删除尾随空格,前导空格,空格,制表符,回车符,换行符等.

向左修剪

CREATE FUNCTION dbo.LTrimX(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @trimchars VARCHAR(10)
SET @trimchars = CHAR(9)+CHAR(10)+CHAR(13)+CHAR(32)
IF @str LIKE '[' + @trimchars + ']%' SET @str = SUBSTRING(@str, PATINDEX('%[^' + @trimchars + ']%', @str), 8000)
RETURN @str
END
Run Code Online (Sandbox Code Playgroud)

修剪正确

CREATE FUNCTION dbo.RTrimX(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @trimchars VARCHAR(10)
SET @trimchars = CHAR(9)+CHAR(10)+CHAR(13)+CHAR(32)
IF @str LIKE '%[' + @trimchars + ']'
SET @str = REVERSE(dbo.LTrimX(REVERSE(@str)))
RETURN @str
END
Run Code Online (Sandbox Code Playgroud)

左右修剪

CREATE FUNCTION dbo.TrimX(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX)
AS
BEGIN
RETURN dbo.LTrimX(dbo.RTrimX(@str))
END
Run Code Online (Sandbox Code Playgroud)

使用功能

SELECT dbo.TRIMX(@MyString)
Run Code Online (Sandbox Code Playgroud)


Sal*_*n A 7

在 SQL Server 2017 中,您可以使用该TRIM函数一次性从头到尾删除特定字符:

WITH testdata(str) AS (
    SELECT CHAR(13) + CHAR(10) + ' test ' + CHAR(13) + CHAR(10)
)
SELECT
    str,
    TRIM(CHAR(13) + CHAR(10) + CHAR(9) + ' ' FROM str) AS [trim cr/lf/tab/space],
    TRIM(CHAR(13) + CHAR(10) FROM str) AS [trim cr/lf],
    TRIM(' ' FROM str) AS [trim space]
FROM testdata
Run Code Online (Sandbox Code Playgroud)

结果:

结果 - 不可打印的字符替换为可见的替代字符

请注意,最后一个示例(修剪空格)没有按预期执行任何操作,因为空格位于中间。