2015-06-24 34 views
13

Sono sbalordito che la questione non è stata posta per significato già. Come si fa a creare una funzione equivalente in SQL come LTRIM o RTRIM per ritorni a capo e la linea si nutre solo all'inizio o alla fine di una stringa.SQL Rimuovere solo iniziali o finali ritorni a capo

Ovviamente REPLACE(REPLACE(@MyString,char(10),''),char(13),'') rimuove tutti i ritorni a capo e nuova linea di feed. Quale NON è quello che sto cercando. Voglio solo rimuovere quelli iniziali o finali.

risposta

17

Trova il primo carattere che è nonCHAR(13) o CHAR(10) e sottrarre la sua posizione dalla lunghezza della stringa.

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

Questo va bene, ma fallisce se la stringa contiene solo caratteri CRLF. PATINDEX restituisce 0 in questo caso, quindi viene restituita l'intera stringa. – Dave

6

seguenti funzioni sono migliorate tipi di trim funzioni che è possibile utilizzare. Copiato da sqlauthority.com

Queste funzioni rimuovere gli spazi finali, gli spazi iniziali, lo spazio bianco, schede, ritorni a capo, avanzamenti di riga ecc

Trim Sinistra

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 destro

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 

Trim sia a sinistra che a destra

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

Utilizzando la funzione

SELECT dbo.TRIMX(@MyString) 
2

Ecco un esempio si può correre:

ho deciso di lanciare i risultati come un valore Xml, così quando si fare clic su di esso, sarà possibile visualizzare i ritorni a capo.

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] 

Ricordare di rimuovere il cast-to-Xml, in quanto questo è stato fatto proprio come un Proof-of-Concept per dimostrare che funziona.

Com'è migliore della risposta attualmente accettata?

A prima vista questo può sembrare di utilizzare più funzioni rispetto alla risposta accettata.
Tuttavia, questo non è il caso.
Se si combinano i due approcci elencati nella risposta accettata (per rimuovere sia Trailing e gli spazi Leading), si sia dovuto fare due passaggi aggiornando il record, o copia tutti una logica nell'altro (ovunque @String è elencato), il che causerebbe più chiamate di funzione e diventerebbe ancora più difficile da leggere.

Problemi correlati