Réponses:
par exemple
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
Si pour une raison quelconque votre logique de colonne est complexe (cas où ... alors ... sinon ... fin), 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, il s'agit d'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, ''))
NULL
s'il est passé une chaîne qui est plus courte que la plage de suppression spécifiée pour STUFF
. Enveloppez-le dans un ISNULL
pour obtenir une valeur de sortie différente pour la casse de chaîne vide.
select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Essaye ça:
select substring('test string', 1, (len('test string') - 1))
select substring('test string', 0, len('test string'))
?
SUBSTRING ( expression ,start , length )
. Désormais, les deux requêtes renvoient la même chose car la numérotation est basée sur 1, ce qui signifie que le premier caractère de l'expression est 1. Si start est inférieur à 1, l'expression renvoyée commencera au premier caractère spécifié dans expression. Source
Si votre chaîne est vide,
DECLARE @String VARCHAR(100)
SET @String = ''
SELECT LEFT(@String, LEN(@String) - 1)
alors ce code provoquera le message d'erreur «Paramètre de longueur non valide passé à la fonction de sous-chaîne».
Vous pouvez le gérer de cette façon:
SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
Il retournera toujours résultat, et NULL en cas de chaîne vide.
Cela fonctionnera même lorsque le texte source / var est nul ou vide:
SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
Si votre colonne est text
et non varchar
, vous pouvez utiliser ceci:
SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
Si vous voulez faire cela en deux étapes, plutôt que les trois de REVERSE-STUFF-REVERSE, vous pouvez avoir votre séparateur de liste d'un ou deux espaces. Ensuite, utilisez RTRIM pour couper les espaces de fin et REMPLACER pour remplacer les doubles espaces par ','
select REPLACE(RTRIM('a b c d '),' ', ', ')
Cependant, ce n'est pas une bonne idée si votre chaîne d'origine peut contenir des espaces internes.
Pas sûr de la performance. Chaque REVERSE crée une nouvelle copie de la chaîne, mais STUFF est un tiers plus rapide que REPLACE.
voir aussi ça
@result = substring(@result, 1, (LEN(@result)-1))
Je peux suggérer ceci -hack-;).
select
left(txt, abs(len(txt + ',') - 2))
from
t;
vous pouvez créer une fonction
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
Essaye ça
DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
Ma réponse est similaire à la réponse acceptée, mais elle vérifie également les chaînes Null et Empty.
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
C'est assez tard, mais curieusement jamais mentionné.
select stuff(x,len(x),1,'')
c'est à dire:
take a string x
go to its last character
remove one character
add nothing
J'adore la réponse de @ bill-hoenig; cependant, j'utilisais une sous-requête et j'ai été rattrapé parce que la fonction REVERSE avait besoin de deux ensembles de parenthèses. Il m'a fallu du temps pour comprendre celui-là!
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
Pour mettre à jour l'enregistrement en coupant les N derniers caractères d'une colonne particulière:
UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause
Essaye ça,
DECLARE @name NVARCHAR(MAX) SET @name='xxxxTHAMIZHMANI****'SELECT Substring(@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)