web-dev-qa-db-fra.com

Supprimer le dernier caractère d'une chaîne dans T-SQL?

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

Par exemple:

'TEST STRING'

rendre:

'TEST STRIN'
132
Daveed

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
182
AdaTheDev

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, ''))
97
Bill Hoenig

Essaye ça:

select substring('test string', 1, (len('test string') - 1))
44
Adrien

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.

24
Max Grachev
select left('TEST STRING', len('TEST STRING')-1)
9
greg121

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

SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
7
Behrens
@result = substring(@result, 1, (LEN(@result)-1))
5
farrukh saleem

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

5
Daryl

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

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

SQL Server Fiddle Démo

4
shA.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
2
Mihail Katrikh

Essaye ça

DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
2
Abhishek Jaiswal

Obtenez le dernier personnage

Right(@string, len(@String) - (len(@String) - 1))
2
Sam

Le texte source/var peut être null ou vide:

SELECT REVERSE (SUBSTRING (REVERSE (@a), 2, 9999))

1
David Roach

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
1
Imran Rizvi
declare @string varchar(20)= 'TEST STRING'
Select left(@string, len(@string)-1) as Tada

sortie:

Tada
--------------------
TEST STRIN
0
Migo

Essaye ça,

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

Et la sortie sera comme, THAMIZHMANI

0
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
0
Manvendra_0611

Essayez-le:

  DECLARE @String NVARCHAR(100)
    SET @String = '12354851'
    SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
0
Chilli

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
0
hurleystylee