Remover o último caractere de uma string no T-SQL?

139

Como faço para remover o último caractere em uma string T-SQL?

Por exemplo:

'TEST STRING'

para retornar:

'TEST STRIN'
Daveed
fonte

Respostas:

195

por exemplo

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
AdaTheDev
fonte
71
Como alternativa: selecione Esquerda (YourColumnName, LEN (YourColumnName) - 1) DE YourTable
Kyle B.
3
Graças para a captura nulo - ISNULL (ESQUERDA (@String, LEN (@String) - 1), 'Mensagem de erro') vai resolver
Volvox
2
@Voxox ainda lançará exceção se a string for String vazia, estou modificando sua resposta para lidar com esse cenário.
21815 Imran Rizvi
106

Se, por algum motivo, a lógica da sua coluna for complexa (caso em que ... então ... else ... end), as soluções acima farão com que você precise repetir a mesma lógica na função len (). Duplicar a mesma lógica se torna uma bagunça. Se for esse o caso, é uma solução digna de nota. Este exemplo se livra da última vírgula indesejada. Finalmente encontrei um uso para a função REVERSE.

select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))
Bill Hoenig
fonte
6
Observe que esse código retornará NULLse for passada uma string menor que o intervalo de exclusão especificado para STUFF. Envolva-o em ISNULLpara obter um valor de saída diferente para o caso de string vazio.
Rozwel 2/12/12
11
Bom, usar isso com uma aplicação externa, com um caminho para xml ('') para eliminar uma vírgula à direita. awseome
Tracker1
Também da mesma maneira que @ Tracker1. Qualquer coisa ao contrário envolvendo LEN () este graciosamente funciona (sem repetir qualquer coisa) para string vazia (especialmente envolto em ISNULL ())
gregmac
É realmente notável o quão brutal o SQL pode ser às vezes. Isto é incrível.
Eouw0o83hf
Obrigado, ajudou-me, no meu caso eu tinha um último espaço para que o primeiro índice é 2select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Arngue
52

Tente o seguinte:

select substring('test string', 1, (len('test string') - 1))
Adrien
fonte
@ Adrien alguma idéia de por que isso parece dar o mesmo resultado que select substring('test string', 0, len('test string'))?
Louis Waweru 23/01
@Louis, a sintaxe subsequência é como se segue: SUBSTRING ( expression ,start , length ). Agora, as duas consultas retornam o mesmo porque a numeração é baseada em 1, o que significa que o primeiro caractere na expressão é 1. Se o início for menor que 1, a expressão retornada começará no primeiro caractere especificado na expressão. Fonte
JS5
26

Se sua string estiver vazia,

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

esse código causará a mensagem de erro 'Parâmetro de comprimento inválido passado para a função de substring'.

Você pode lidar com isso desta maneira:

SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))

Ele sempre retornará resultado e NULL no caso de sequência vazia.

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

Isso funcionará mesmo quando o texto de origem / var for nulo ou vazio:

SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
David Roach
fonte
2
Este é um comentário subestimado, é rápido e não precisa selecionar a sequência duas vezes para funcionar.
Randall
7

Se sua cor é texte não varchar, você pode usar o seguinte:

SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
MicBehrens
fonte
5

Se você quiser fazer isso em duas etapas, em vez das três de REVERSE-STUFF-REVERSE, poderá separar sua lista em um ou dois espaços. Em seguida, use RTRIM para aparar os espaços finais e REPLACE para substituir os espaços duplos por ','

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

No entanto, isso não é uma boa ideia se a string original puder conter espaços internos.

Não tenho certeza sobre o desempenho. Cada REVERSE cria uma nova cópia da string, mas STUFF é um terço mais rápido que REPLACE.

veja também isso

Daryl
fonte
5
@result = substring(@result, 1, (LEN(@result)-1))
farrukh saleem
fonte
2

você pode criar função

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
Mihail Katrikh
fonte
2

Tente isto

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

Obter o último caractere

Right(@string, len(@String) - (len(@String) - 1))
Sam
fonte
Eu não acho que isso é o que ele estava perguntando, no entanto - isso pode ser útil para colocar um comentário, no entanto.
jimwise
3
apenas para a direita (@string, 1).
GoalBaseado
1

Minha resposta é semelhante à resposta aceita, mas também verifica se há Null e Empty String.

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
Imran Rizvi
fonte
1

É bastante tarde, mas curiosamente ainda não foi mencionado.

select stuff(x,len(x),1,'')

ou seja:

take a string x
go to its last character
remove one character
add nothing
George Menoutis
fonte
0

Adoro a resposta de @ bill-hoenig; no entanto, eu estava usando uma subconsulta e fui pego porque a função REVERSE precisava de dois conjuntos de parênteses. Levei um tempo para descobrir isso!

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
hurleystylee
fonte
Você pode usar uma aplicação externa / cruzada para a parte composta da consulta. Estou usando isso para obter um conjunto de sinalizadores para um item pai.
precisa saber é o seguinte
0

Para atualizar o registro aparando os últimos N caracteres de uma coluna específica:

UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause
Manvendra_0611
fonte
0

Tente :

  DECLARE @String NVARCHAR(100)
    SET @String = '12354851'
    SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
Pimenta
fonte
0
declare @string varchar(20)= 'TEST STRING'
Select left(@string, len(@string)-1) as Tada

resultado:

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

Tente isso,

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

E a saída será como, THAMIZHMANI

Thamizhmani
fonte
-1
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)
Julie
fonte