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.
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)
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)
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.