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)