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'
Daveed
quelle

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
AdaTheDev
quelle
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, ''))
Bill Hoenig
quelle
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
quelle
@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.

Max Grachev
quelle
10
select left('TEST STRING', len('TEST STRING')-1)
greg121
quelle
9

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

SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
David Roach
quelle
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))
Behrens
quelle
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

Daryl
quelle
5
@result = substring(@result, 1, (LEN(@result)-1))
farrukh saleem
quelle
5

Ich kann das vorschlagen -hack-;).

select 
    left(txt, abs(len(txt + ',') - 2))
from 
    t;

SQL Server Fiddle Demo

shA.t.
quelle
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
Mihail Katrikh
quelle
2

Versuche dies

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

Holen Sie sich das letzte Zeichen

Right(@string, len(@String) - (len(@String) - 1))
Sam
quelle
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
Imran Rizvi
quelle
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
George Menoutis
quelle
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
Hurleystylee
quelle
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
Manvendra_0611
quelle
0

Versuch es :

  DECLARE @String NVARCHAR(100)
    SET @String = '12354851'
    SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
Chili
quelle
0
declare @string varchar(20)= 'TEST STRING'
Select left(@string, len(@string)-1) as Tada

Ausgabe:

Tada
--------------------
TEST STRIN
Migo
quelle
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

Thamizhmani
quelle
-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)
Julie
quelle