Das letzte Zeichen in einer Zeichenfolge in T-SQL entfernen?


139

Wie entferne ich das letzte Zeichen in einer Zeichenfolge in T-SQL?

Beispielsweise:

'TEST STRING'

zurückgeben:

'TEST STRIN'

Antworten:


195

z.B

DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'

-- Chop off the end character
SET @String = 
     CASE @String WHEN null THEN null 
     ELSE (
         CASE LEN(@String) WHEN 0 THEN @String 
            ELSE LEFT(@String, LEN(@String) - 1) 
         END 
     ) END


SELECT @String

71
Alternativ: SELECT LEFT (YourColumnName, LEN (YourColumnName) - 1) FROM YourTable
Kyle B.

3
Vielen Dank für den Null-Fang - ISNULL (LINKS (@String, LEN (@String) - 1), 'ErrMsg') wird gelöst
Volvox

2
@Volvox es wird immer noch eine Ausnahme auslösen, wenn die Zeichenfolge "Leere Zeichenfolge" ist. Ich ändere Ihre Antwort, um dieses Szenario zu behandeln.
Imran Rizvi

106

Wenn Ihre Spaltenlogik aus irgendeinem Grund komplex ist (Fall, wenn ... dann ... sonst ... endet), müssen Sie bei den oben genannten Lösungen dieselbe Logik in der Funktion len () wiederholen. Das Duplizieren derselben Logik wird zu einem Chaos. Wenn dies der Fall ist, ist dies eine bemerkenswerte Lösung. In diesem Beispiel wird das letzte unerwünschte Komma entfernt. Ich habe endlich eine Verwendung für die REVERSE-Funktion gefunden.

select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))

6
Beachten Sie, dass dieser Code zurückgegeben wird, NULLwenn eine Zeichenfolge übergeben wird, die kürzer als der angegebene Löschbereich ist STUFF. Wickeln Sie es in ein ISNULL, um einen anderen Ausgabewert für den leeren Zeichenfolgenfall zu erhalten.
Rozwel

11
Schön, wenn Sie dies mit einem äußeren Apply und einem for xml-Pfad ('') verwenden, um ein nachfolgendes Komma zu entfernen. awseome
Tracker1

Auch genauso wie @ Tracker1. Im Gegensatz zu LEN () funktioniert dies ordnungsgemäß (ohne etwas zu wiederholen) für leere Zeichenfolgen (insbesondere in ISNULL () eingeschlossen)
Gregmac

Es ist wirklich bemerkenswert, wie brutal SQL manchmal sein kann. Das ist unglaublich.
eouw0o83hf

Danke, es hat mir geholfen, in meinem Fall hatte ich ein letztes Leerzeichen, also ist der erste Index 2select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Arngue

52

Versuche dies:

select substring('test string', 1, (len('test string') - 1))

@Adrien eine Idee, warum dies das gleiche Ergebnis zu geben scheint wie select substring('test string', 0, len('test string'))?
Louis Waweru

@ Louis, die Teilzeichenfolgensyntax lautet wie folgt : SUBSTRING ( expression ,start , length ). Jetzt geben beide Abfragen dasselbe zurück, da die Nummerierung auf 1 basiert. Dies bedeutet, dass das erste Zeichen im Ausdruck 1 ist. Wenn start kleiner als 1 ist, beginnt der zurückgegebene Ausdruck mit dem ersten Zeichen, das im Ausdruck angegeben ist. Quelle
JS5

26

Wenn Ihre Zeichenfolge leer ist,

DECLARE @String VARCHAR(100)
SET @String = ''
SELECT LEFT(@String, LEN(@String) - 1)

dann verursacht dieser Code die Fehlermeldung 'Ungültiger Längenparameter an die Teilzeichenfolgenfunktion übergeben.'

Sie können folgendermaßen damit umgehen:

SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))

Es wird immer das Ergebnis und bei leerer Zeichenfolge NULL zurückgegeben.



9

Dies funktioniert auch dann, wenn der Quelltext / var null oder leer ist:

SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))

2
Dies ist ein unterschätzter Kommentar, er ist schnell und muss nicht zweimal ausgewählt werden, um zu funktionieren.
Randall

7

Wenn Ihre Spalte ist textund nicht varchar, können Sie dies verwenden:

SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))

5

Wenn Sie dies in zwei Schritten tun möchten, anstatt in den drei Schritten von REVERSE-STUFF-REVERSE, kann Ihr Listentrennzeichen ein oder zwei Leerzeichen sein. Verwenden Sie dann RTRIM, um die nachfolgenden Leerzeichen zu kürzen, und REPLACE, um die doppelten Leerzeichen durch ',' zu ersetzen.

select REPLACE(RTRIM('a  b  c  d  '),'  ', ', ')

Dies ist jedoch keine gute Idee, wenn Ihre ursprüngliche Zeichenfolge interne Leerzeichen enthalten kann.

Ich bin mir nicht sicher über die Leistung. Jeder REVERSE erstellt eine neue Kopie des Strings, aber STUFF ist ein Drittel schneller als REPLACE.

sehe das auch




2

Sie können eine Funktion erstellen

CREATE FUNCTION [dbo].[TRUNCRIGHT] (@string NVARCHAR(max), @len int = 1)
RETURNS NVARCHAR(max)
AS
BEGIN
    IF LEN(@string)<@len
        RETURN ''
    RETURN LEFT(@string, LEN(@string) - @len)
END

2

Versuche dies

DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn

2

Holen Sie sich das letzte Zeichen

Right(@string, len(@String) - (len(@String) - 1))

Ich glaube jedoch nicht, dass er darum gebeten hat - dies könnte jedoch nützlich sein, um einen Kommentar abzugeben.
Jimwise

3
genau richtig (@string, 1).
GoalBased

1

Meine Antwort ähnelt der akzeptierten Antwort, sucht aber auch nach Null und Leerzeichenfolge.

DECLARE @String VARCHAR(100)

SET @String = 'asdfsdf1'

-- If string is null return null, else if string is empty return as it is, else chop off the end character
SET @String = Case @String when null then null else (case LEN(@String) when 0 then @String else LEFT(@String, LEN(@String) - 1) end ) end

SELECT @String

1

Dies ist ziemlich spät, aber interessanterweise noch nie erwähnt.

select stuff(x,len(x),1,'')

dh:

take a string x
go to its last character
remove one character
add nothing

0

Ich liebe die Antwort von @ bill-hoenig; Ich habe jedoch eine Unterabfrage verwendet und wurde eingeholt, weil die REVERSE-Funktion zwei Sätze von Klammern benötigte. Ich habe eine Weile gebraucht, um das herauszufinden!

SELECT
   -- Return comma delimited list of all payment reasons for this Visit
   REVERSE(STUFF(REVERSE((
        SELECT DISTINCT
               CAST(CONVERT(varchar, r1.CodeID) + ' - ' + c.Name + ', ' AS VARCHAR(MAX))
          FROM VisitReason r1
          LEFT JOIN ReasonCode c        ON c.ID = r1.ReasonCodeID
         WHERE p.ID = r1.PaymentID
         FOR XML PATH('')
              )), 1, 2, ''))                        ReasonCode
  FROM Payments p

Möglicherweise möchten Sie eine äußere / Kreuzanwendung für den zusammengesetzten Teil der Abfrage verwenden. Ich verwende dies, um eine Reihe von Flags für ein übergeordnetes Element abzurufen.
Tracker1

0

So aktualisieren Sie den Datensatz durch Trimmen der letzten N Zeichen einer bestimmten Spalte:

UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause

0

Versuch es :

  DECLARE @String NVARCHAR(100)
    SET @String = '12354851'
    SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))

0
declare @string varchar(20)= 'TEST STRING'
Select left(@string, len(@string)-1) as Tada

Ausgabe:

Tada
--------------------
TEST STRIN

0

Versuche dies,

DECLARE @name NVARCHAR(MAX) SET @name='xxxxTHAMIZHMANI****'SELECT Substring(@name, 5, (len(@name)-8)) as UserNames

Und die Ausgabe wird wie THAMIZHMANI sein


-1
declare @x varchar(20),@y varchar(20)
select @x='sam'
select 
case when @x is null then @y
      when @y is null then @x
      else @x+','+@y
end


go

declare @x varchar(20),@y varchar(20)
select @x='sam'
--,@y='john'
DECLARE @listStr VARCHAR(MAX)   

SELECT @listStr = COALESCE(@x + ', ' ,'') +coalesce(@y+',','')
SELECT left(@listStr,len(@listStr)-1)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.