Comment puis-je supprimer le dernier caractère d'une chaîne dans T-SQL
?
Par exemple:
'TEST STRING'
rendre:
'TEST STRIN'
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), les solutions ci-dessus vous obligent à répéter la même logique dans la fonction len (). La duplication de 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é un usage pour la fonction REVERSE.
select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))
Essaye ça:
select substring('test string', 1, (len('test string') - 1))
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 transmis à 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 le résultat, et NULL en cas de chaîne vide.
select left('TEST STRING', len('TEST STRING')-1)
Si votre colonne est text
et non varchar
, alors vous pouvez utiliser ceci:
SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
@result = substring(@result, 1, (LEN(@result)-1))
Si vous souhaitez effectuer cette opération en deux étapes au lieu des trois étapes de REVERSE-STUFF-REVERSE, vous pouvez définir un séparateur de liste de un ou deux espaces. Ensuite, utilisez RTRIM pour couper les espaces de fin et REPLACE 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 en est un tiers plus rapide que REPLACE.
voir aussi this
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
Obtenez le dernier personnage
Right(@string, len(@String) - (len(@String) - 1))
Le texte source/var peut être null ou vide:
SELECT REVERSE (SUBSTRING (REVERSE (@a), 2, 9999))
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
declare @string varchar(20)= 'TEST STRING'
Select left(@string, len(@string)-1) as Tada
sortie:
Tada
--------------------
TEST STRIN
Essaye ça,
DECLARE @name NVARCHAR(MAX) SET @name='xxxxTHAMIZHMANI****'SELECT Substring(@name, 5, (len(@name)-8)) as UserNames
Et la sortie sera comme, THAMIZHMANI
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
Essayez-le:
DECLARE @String NVARCHAR(100)
SET @String = '12354851'
SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
J'adore la réponse de @ bill-hoenig; Cependant, j'utilisais une sous-requête et je me suis fait avoir parce que la fonction REVERSE nécessitait deux jeux de parenthèses. Il m'a fallu un certain temps pour le comprendre!
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