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

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

par exemple:

'TEST STRING'

de retour:

'TEST STRIN'
117
demandé sur gotqn 2009-08-11 00:01:09

19 réponses

p.ex.

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
167
répondu AdaTheDev 2016-07-09 01:25:17

si, pour une raison quelconque, la logique de votre colonne est complexe (cas où ... puis. .. autre. .. fin), puis 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 c'est le cas, alors c'est une solution qui mérite d'être souligné. Cet exemple se débarrasse de la dernière virgule non désirée. J'ai finalement trouvé une utilisation pour la fonction inverse.

select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))
92
répondu Bill Hoenig 2012-02-02 01:15:17

essayez ceci:

select substring('test string', 1, (len('test string') - 1))
36
répondu Adrien 2009-08-10 20:03:21

si votre chaîne est vide,

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

alors ce code causera un message D'erreur 'paramètre de longueur invalide passé à la fonction de soustraction.

, Vous pouvez 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.

20
répondu Max Grachev 2012-04-28 12:49:07

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

SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
6
répondu Behrens 2012-10-26 13:34:08

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 être un ou deux espaces. Ensuite, utilisez RTRIM pour couper les espaces de fuite et remplacez les doubles espaces par ','

select REPLACE(RTRIM('a  b  c  d  '),'  ', ', ')

cependant, ce n'est pas une bonne idée si votre chaîne originale peut contenir des espaces internes.

pas sûr de la performance. Chaque revers crée une nouvelle copie de la chaîne, mais la substance est une troisième plus rapide que le remplacement.

voir aussi ce

5
répondu Daryl 2017-05-23 12:03:06
select left('TEST STRING', len('TEST STRING')-1)
5
répondu greg121 2015-11-20 12:58:58
@result = substring(@result, 1, (LEN(@result)-1))
4
répondu farrukh saleem 2017-08-03 12:22:24

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

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

SQL Server Fiddle Demo

3
répondu shA.t 2017-11-14 23:01:42

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
répondu Mihail Katrikh 2015-04-18 22:39:28

Obtenir le dernier caractère Droit(@ficelle, len(@String) - (len(@String) - 1))

1
répondu Sam 2013-01-24 16:41:55

ma réponse est similaire à la réponse acceptée, mais elle vérifie aussi la chaîne nulle et vide.

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
répondu Imran Rizvi 2015-10-14 13:59:51

Essayez cette

DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
1
répondu Abhishek Jaiswal 2016-10-19 05:51:28

j'adore la réponse de @bill-hoenig; cependant, j'utilisais une sous-requête et j'ai été rattrapé parce que la fonction inverse avait besoin de deux séries de parenthèses. M'a fallu un certain temps pour comprendre que l'on sort!

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
répondu hurleystylee 2012-09-11 16:18:43

pour mettre à jour le document en taillant les N derniers caractères d'une colonne particulière:

UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause
0
répondu Manvendra_0611 2015-10-27 06:34:10

L'Essayer :

  DECLARE @String NVARCHAR(100)
    SET @String = '12354851'
    SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
0
répondu Chilli 2015-10-27 06:53:47
declare @string varchar(20)= 'TEST STRING'
Select left(@string, len(@string)-1) as Tada

sortie:

Tada
--------------------
TEST STRIN
0
répondu Migo 2015-10-27 07:38:56

Essayez cette,

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

et la sortie sera comme, THAMIZHMANI

0
répondu Thamizhmani 2017-05-07 11:03:57
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)
-1
répondu Julie 2013-05-15 11:44:27