it-swarm.com.de

SQL Entfernen Sie nur führende oder nachgestellte Wagenrückläufe

Ich bin verblüfft, dass diese Frage noch nicht sinnvoll gestellt wurde. Wie kann man eine äquivalente Funktion in SQL erstellen, wie LTRIM oder RTRIM für Wagenrücklauf und Zeilenvorschub NUR am Anfang oder Ende eines Strings.

Offensichtlich entfernt REPLACE(REPLACE(@MyString,char(10),''),char(13),'') ALLE Wagenrücklauf und neue Zeilenvorschübe. Welches ist NICHT was ich suche. Ich möchte nur führende oder nachlaufende entfernen.

16
dynamphorous

Suchen Sie das erste Zeichen, das nichtCHAR(13) oder CHAR(10) ist, und ziehen Sie seine Position von der Länge des Strings ab.

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

Die folgenden Funktionen sind erweiterte Typen von trim-Funktionen, die Sie verwenden können. Kopieren von sqlauthority.com

Diese Funktionen entfernen nachfolgende Leerzeichen, führende Leerzeichen, Leerzeichen, Registerkarten, Zeilenumbrüche, Zeilenvorschub usw.

Links zuschneiden

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

Links und rechts trimmen

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

Funktion verwenden

SELECT dbo.TRIMX(@MyString)
7
sqluser

Hier ist ein Beispiel, das Sie ausführen können:

Ich entschied mich dafür, die Ergebnisse als Xml-Wert zu konvertieren. Wenn Sie darauf klicken, können Sie die Wagenrücklaufdaten anzeigen.

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]

Denken Sie daran, das Cast-to-Xml zu entfernen, da dies nur als Proof-of-Concept ausgeführt wurde, um zu zeigen, dass es funktioniert .

Wie ist das besser als die aktuell akzeptierte Antwort?

Auf den ersten Blick scheint dies mehr Funktionen als die akzeptierte Antwort zu verwenden.
Dies ist jedoch nicht der Fall.
Wenn Sie beide Ansätze kombinieren, die in der Akzeptierten Antwort aufgeführt sind (um sowohl nachlaufende als auch führende Leerzeichen zu entfernen), müssen Sie entweder zwei Durchgänge machen, um den Datensatz zu aktualisieren, oder die gesamte Logik in das andere (überall ist @String aufgeführt), was zu mehr Funktionsaufrufen führen würde und noch schwieriger zu lesen wäre.

2
MikeTeeVee

In SQL Server 2017 können Sie die Funktion TRIM verwenden, um bestimmte Zeichen von Anfang und Ende auf einmal zu entfernen:

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

Ergebnis:

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

Beachten Sie, dass das letzte Beispiel (Leerzeichen) nicht wie erwartet funktioniert.

0
Salman A