web-dev-qa-db-fra.com

SQL Supprimer uniquement les retours chariot précédant ou suivant

Je suis abasourdi que cette question n'ait pas déjà été posée de manière significative. Comment créer une fonction équivalente en SQL, telle que LTRIM ou RTRIM pour les retours à la ligne et les sauts de ligne UNIQUEMENT au début ou à la fin d'une chaîne.

De toute évidence, REPLACE(REPLACE(@MyString,char(10),''),char(13),'') supprime TOUS les retours de chariot et les nouveaux sauts de ligne. Ce qui n'est pas ce que je cherche. Je veux juste supprimer les premiers ou les derniers.

16
dynamphorous

Recherchez le premier caractère pasCHAR(13) ou CHAR(10) et soustrayez sa position de la longueur de la chaîne.

LTRIM ()

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

RTRIM ()

SELECT LEFT(@MyString,LEN(@MyString)-PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%',REVERSE(@MyString))+1)
24
Anon

Les fonctions suivantes sont des types améliorés de fonctions trim que vous pouvez utiliser. Copié de sqlauthority.com

Ces fonctions suppriment les espaces de fin, les espaces de début, les espaces, les tabulations, les retours à la ligne, les sauts de ligne, etc.

Trim Left

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

Trim Right

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

Découper à gauche et à droite

CREATE FUNCTION dbo.TrimX(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX)
AS
BEGIN
RETURN dbo.LTrimX(dbo.RTrimX(@str))
END

Utilisation de la fonction

SELECT dbo.TRIMX(@MyString)
7
sqluser

Dans SQL Server 2017, vous pouvez utiliser la fonction TRIM pour supprimer des caractères spécifiques du début et de la fin, en une fois:

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

Résultat:

+----------------+---------------------+------------+----------------+
|str             |trim cr/lf/tab/space |trim cr/lf  |trim space      |
+----------------+---------------------+------------+----------------+
|␍␊␠test␠␍␊ |test                 |␠test␠    |␍␊␠test␠␍␊ |
+----------------+---------------------+------------+----------------+

Notez que le dernier exemple (espace de découpe) ne fait rien comme prévu.

0
Salman A