Odpowiedzi:
na przykład
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
Jeśli z jakiegoś powodu logika Twojej kolumny jest złożona (przypadek kiedy ... then ... else ... end), powyższe rozwiązania powodują, że musisz powtórzyć tę samą logikę w funkcji len (). Powielanie tej samej logiki staje się bałaganem. Jeśli tak jest, to warto zwrócić uwagę na to rozwiązanie. Ten przykład usuwa ostatni niechciany przecinek. W końcu znalazłem zastosowanie funkcji REVERSE.
select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))
NULL
jeśli przekazano ciąg, który jest krótszy niż zakres usuwania określony dla STUFF
. Zawiń go w an, ISNULL
aby uzyskać inną wartość wyjściową dla pustej wielkości łańcucha.
select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Spróbuj tego:
select substring('test string', 1, (len('test string') - 1))
select substring('test string', 0, len('test string'))
?
SUBSTRING ( expression ,start , length )
. Teraz oba zapytania zwracają to samo, ponieważ numeracja jest oparta na 1, co oznacza, że pierwszy znak w wyrażeniu to 1. Jeśli początek jest mniejszy niż 1, zwrócone wyrażenie rozpocznie się od pierwszego znaku określonego w wyrażeniu. Źródło
Jeśli twój ciąg jest pusty,
DECLARE @String VARCHAR(100)
SET @String = ''
SELECT LEFT(@String, LEN(@String) - 1)
wtedy ten kod spowoduje komunikat o błędzie „Nieprawidłowy parametr długości przekazany do funkcji podciągu”.
Możesz sobie z tym poradzić w ten sposób:
SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
Zawsze zwróci wynik i NULL w przypadku pustego ciągu.
To zadziała nawet wtedy, gdy tekst źródłowy / var ma wartość null lub jest pusty:
SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
Jeśli twój coloumn jest text
i nie varchar
, możesz użyć tego:
SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
Jeśli chcesz to zrobić w dwóch krokach, zamiast trzech z ODWRÓĆ-STUFF-ODWRÓĆ, możesz ustawić separator listy w postaci jednej lub dwóch spacji. Następnie użyj RTRIM, aby przyciąć końcowe spacje i REPLACE, aby zamienić podwójne spacje na ','
select REPLACE(RTRIM('a b c d '),' ', ', ')
Jednak nie jest to dobry pomysł, jeśli oryginalny ciąg może zawierać spacje wewnętrzne.
Nie jestem pewien co do wydajności. Każde REVERSE tworzy nową kopię ciągu, ale STUFF jest o jedną trzecią szybsze niż REPLACE.
zobacz też to
@result = substring(@result, 1, (LEN(@result)-1))
Mogę to zasugerować -hack-;).
select
left(txt, abs(len(txt + ',') - 2))
from
t;
możesz stworzyć funkcję
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
Spróbuj tego
DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
Moja odpowiedź jest podobna do zaakceptowanej odpowiedzi, ale sprawdza również wartość Null i Empty String.
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
To dość późno, ale co ciekawe, jeszcze nigdy nie wspomniano.
select stuff(x,len(x),1,'')
to znaczy:
take a string x
go to its last character
remove one character
add nothing
Uwielbiam odpowiedź @ bill-hoenig; jednak korzystałem z podzapytania i zostałem złapany, ponieważ funkcja REVERSE potrzebowała dwóch zestawów nawiasów. Zajęło mi trochę czasu, zanim to rozgryzłem!
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
Aby zaktualizować rekord przez obcięcie ostatnich N znaków z określonej kolumny:
UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause
Spróbuj tego,
DECLARE @name NVARCHAR(MAX) SET @name='xxxxTHAMIZHMANI****'SELECT Substring(@name, 5, (len(@name)-8)) as UserNames
A wynik będzie podobny do THAMIZHMANI
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)