Supprimer le dernier caractère d'une string dans T-SQL?

Comment puis-je supprimer le dernier caractère d'une string dans T-SQL ?

Par exemple:

 'TEST STRING' 

revenir:

 'TEST STRIN' 

par exemple

 DECLARE @Ssortingng VARCHAR(100) SET @Ssortingng = 'TEST STRING' -- Chop off the end character SET @Ssortingng = CASE @Ssortingng WHEN null THEN null ELSE ( CASE LEN(@Ssortingng) WHEN 0 THEN @Ssortingng ELSE LEFT(@Ssortingng, LEN(@Ssortingng) - 1) END ) END SELECT @Ssortingng 

Si pour une raison quelconque votre logique de colonne est complexe (cas où … alors … else … end), alors les solutions ci-dessus vous obligent à répéter la même logique dans la fonction len (). Dupliquer la même logique devient un gâchis. Si tel est le cas, alors c'est une solution à noter. Cet exemple supprime la dernière virgule indésirable. J'ai finalement trouvé une utilisation pour la fonction REVERSE.

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

Essaye ça:

 select subssortingng('test ssortingng', 1, (len('test ssortingng') - 1)) 

Si votre string est vide,

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

alors ce code provoquera un message d'erreur "Paramètre de longueur invalide passé à la fonction de sous-string".

Vous pouvez le gérer de cette façon:

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

Il returnnera toujours le résultat, et NULL en cas de string vide.

Si vous voulez faire cela en deux étapes, plutôt que les trois de REVERSE-STUFF-REVERSE, vous pouvez avoir votre séparateur de list d'un ou deux espaces. Ensuite, utilisez RTRIM pour rogner les espaces de fin, et REPLACE pour replace les espaces doubles par ','

 select REPLACE(RTRIM('abcd '),' ', ', ') 

Cependant, ce n'est pas une bonne idée si votre string d'origine peut contenir des espaces internes.

Pas sûr de la performance. Chaque REVERSE crée une nouvelle copy de la string, mais STUFF est un tiers plus rapide que REPLACE.

voir aussi

Si votre coloumn est text et non varchar , alors vous pouvez utiliser ceci:

 SELECT SUBSTRING(@Ssortingng, 1, NULLIF(DATALENGTH(@Ssortingng)-1,-1)) 
 select left('TEST STRING', len('TEST STRING')-1) 

Je peux suggérer ceci -hack-;).

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

SQL Server Fiddle Demo

Récupère le dernier caractère Droite (@ssortingng, len (@Ssortingng) – (len (@Ssortingng) – 1))

vous pouvez créer une fonction

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

Essaye ça

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

J'aime la réponse de @ bill-hoenig; Cependant, j'utilisais une sous-requête et j'ai été rattrapé parce que la fonction REVERSE nécessitait deux sets de parenthèses. Ça m'a pris un moment pour comprendre ça!

 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 

Ma réponse est similaire à la réponse acceptée, mais elle vérifie également Null et la string vide.

 DECLARE @Ssortingng VARCHAR(100) SET @Ssortingng = 'asdfsdf1' -- If ssortingng is null return null, else if ssortingng is empty return as it is, else chop off the end character SET @Ssortingng = Case @Ssortingng when null then null else (case LEN(@Ssortingng) when 0 then @Ssortingng else LEFT(@Ssortingng, LEN(@Ssortingng) - 1) end ) end SELECT @Ssortingng 

Pour mettre à jour l'logging en réduisant les derniers caractères N d'une colonne particulière:

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

Essayez-le:

  DECLARE @Ssortingng NVARCHAR(100) SET @Ssortingng = '12354851' SELECT LEFT(@Ssortingng, NULLIF(LEN(@Ssortingng)-1,-1)) 
 declare @ssortingng varchar(20)= 'TEST STRING' Select left(@ssortingng, len(@ssortingng)-1) as Tada 

sortie:

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

Essaye ça,

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

Et la sortie sera comme, 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)