Antworten:
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
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, ''))
NULL
wenn 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.
select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Versuche dies:
select substring('test string', 1, (len('test string') - 1))
select substring('test string', 0, len('test string'))
?
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
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.
Dies funktioniert auch dann, wenn der Quelltext / var null oder leer ist:
SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
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
@result = substring(@result, 1, (LEN(@result)-1))
Ich kann das vorschlagen -hack-;).
select
left(txt, abs(len(txt + ',') - 2))
from
t;
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
Versuche dies
DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
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
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
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
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
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
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)