2015-06-24 29 views
13

Jestem zdziwiony, że to pytanie nie zostało już zadane w sposób znaczący. W jaki sposób można uzyskać równoważną funkcję w języku SQL, np. LTRIM lub RTRIM dla zwrotów karetki i linii tylko TYLKO na początku lub na końcu ciągu znaków.SQL Usuń tylko początkowe lub końcowe znaki powrotu karetki

Oczywiście REPLACE(REPLACE(@MyString,char(10),''),char(13),'') usuwa WSZYSTKIE powroty karetki i nowe linie. Który NIE jest tym, czego szukam. Chcę tylko usunąć wiodące lub końcowe.

Odpowiedz

17

Znajdź pierwszy znak, który znajduje nieCHAR(13) lub CHAR(10) i odejmować swoje stanowisko od długości struny.

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) 
+0

To jest dobre, ale kończy się niepowodzeniem, jeśli ciąg zawiera tylko znaki CRLF. PATINDEX zwraca 0 w tym przypadku, więc cały ciąg jest zwracany. – Dave

6

Następujące funkcje są wzmocnione rodzajów trim funkcji można użyć. Skopiowane z sqlauthority.com

Te funkcje usuń spacje, spacje, białej przestrzeni, JOT, karetki, linia pasz itd

trymu lewo

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 

trymowania Prawy

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 

trymowania zarówno lewy i prawy

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

Korzystanie funkcja

SELECT dbo.TRIMX(@MyString) 
2

Oto przykład można uruchomić:

postanowiłem rzucić wyniki jako wartość Xml, więc kiedy kliknij na niego, będziesz mógł zobaczyć Zwroty Carriage.

DECLARE @CRLF Char(2) = (CHAR(0x0D) + CHAR(0x0A)) 
DECLARE @String VarChar(MAX) = @CRLF + @CRLF + ' Hello' + @CRLF + 'World ' + @CRLF + @CRLF 
--Unmodified String: 
SELECT CAST(@String as Xml)[Unmodified] 
--Remove Trailing Whitespace (including Spaces). 
SELECT CAST(LEFT(@String, LEN(REPLACE(@String, @CRLF, ' '))) as Xml)[RemoveTrailingWhitespace] 
--Remove Leading Whitespace (including Spaces). 
SELECT CAST(RIGHT(@String, LEN(REVERSE(REPLACE(@String, @CRLF, ' ')))) as Xml)[RemoveLeadingWhitespace] 
--Remove Leading & Trailing Whitespace (including Spaces). 
SELECT CAST(SUBSTRING(@String, LEN(REPLACE(@String, ' ', '_')) - LEN(REVERSE(REPLACE(@String, @CRLF, ' '))) + 1, LEN(LTRIM(RTRIM(REPLACE(@String, @CRLF, ' '))))) as Xml)[RemoveAllWhitespace] 
--Remove Only Leading and Trailing CR/LF's (while still preserving all other Whitespace - including Spaces). - 04/06/2016 - MCR. 
SELECT CAST(SUBSTRING(@String, PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%',@String), LEN(REPLACE(@String, ' ', '_')) - PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%',@String) + 1 - PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%', REVERSE(@String)) + 1) as Xml)[RemoveLeadingAndTrailingCRLFsOnly] 

Pamiętaj, aby usunąć Cast-to-XML, jak to zostało zrobione tak jak Proof-of-Concept, aby pokazać to działa.

Jak to jest lepsze niż obecnie akceptowana odpowiedź?

Na pierwszy rzut oka może się wydawać, że korzysta z większej liczby funkcji niż Akceptowana odpowiedź.
Jednak tak nie jest.
Jeśli połączyć oba podejścia wymienione w przyjętym Odpowiedź (aby usunąć zarówno tylną i przednią spacje), będzie trzeba albo zrobić dwa przejścia aktualizacji rekordu lub kopię wszystko jedno logiczne do drugiej (wszędzie @String jest na liście), co spowodowałoby znacznie więcej wywołań funkcji i stałoby się jeszcze trudniejsze do odczytania.

Powiązane problemy