¿Eliminar el último carácter de una cadena en T-SQL?

139

¿Cómo elimino el último carácter de una cadena T-SQL?

Por ejemplo:

'TEST STRING'

regresar:

'TEST STRIN'
Daveed
fuente

Respuestas:

195

p.ej

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
fuente
71
Alternativamente: SELECCIONE IZQUIERDA (YourColumnName, LEN (YourColumnName) - 1) DESDE YourTable
Kyle B.
3
Gracias por la captura nula - ISNULL (IZQUIERDA (@String, LEN (@String) - 1), 'ErrMsg') resolverá
Volvox
2
@Volvox todavía arrojará una excepción si la cadena es una cadena vacía, estoy modificando su respuesta para manejar este escenario.
Imran Rizvi
106

Si por alguna razón la lógica de su columna es compleja (caso cuando ... entonces ... más ... finaliza), entonces las soluciones anteriores hacen que tenga que repetir la misma lógica en la función len (). Duplicar la misma lógica se convierte en un desastre. Si este es el caso, entonces esta es una solución digna de mención. Este ejemplo elimina la última coma no deseada. Finalmente encontré un uso para la función REVERSE.

select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))
Bill Hoenig
fuente
66
Tenga en cuenta que este código regresa NULLsi se pasa una cadena que es más corta que el rango de eliminación especificado para STUFF. Envuélvala en un ISNULLpara obtener un valor de salida diferente para el caso de cadena vacía.
Rozwel
11
Bien, usar esto con una aplicación externa, con una ruta for xml ('') para eliminar una coma final. awseome
Tracker1
También de la misma manera que @ Tracker1. A diferencia de cualquier cosa que involucre LEN (), esto funciona con gracia (sin repetir nada) para una cadena vacía (especialmente envuelta en ISNULL ())
gregmac
Es realmente notable cuán brutal puede ser SQL a veces. Esto es increíble.
eouw0o83hf
Gracias, me ayudó, en mi caso tuve un último espacio, así que el primer índice es 2select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Arngue
52

Prueba esto:

select substring('test string', 1, (len('test string') - 1))
Adrien
fuente
@Adrien alguna idea de por qué esto parece dar el mismo resultado que select substring('test string', 0, len('test string'))?
Louis Waweru el
@Louis, la sintaxis subcadena es el siguiente: SUBSTRING ( expression ,start , length ). Ahora, ambas consultas devuelven lo mismo porque la numeración se basa en 1, lo que significa que el primer carácter de la expresión es 1. Si start es menor que 1, la expresión devuelta comenzará en el primer carácter especificado en la expresión. Fuente
JS5
26

Si tu cadena está vacía,

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

entonces este código causará el mensaje de error 'Parámetro de longitud no válido pasado a la función de subcadena'.

Puedes manejarlo de esta manera:

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

Siempre devolverá resultado y NULL en caso de cadena vacía.

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

Esto funcionará incluso cuando el texto fuente / var sea nulo o vacío:

SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
David Roach
fuente
2
Este es un comentario subestimado, es rápido y no tiene que seleccionar la cadena dos veces para que funcione.
Randall
7

Si su coloumn es texty no varchar, entonces puede usar esto:

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

Si desea hacer esto en dos pasos, en lugar de los tres de REVERSE-STUFF-REVERSE, puede hacer que su separador de lista sea uno o dos espacios. Luego use RTRIM para recortar los espacios finales, y REPLACE para reemplazar los espacios dobles con ','

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

Sin embargo, esta no es una buena idea si su cadena original puede contener espacios internos.

No estoy seguro sobre el rendimiento. Cada REVERSE crea una nueva copia de la cadena, pero STUFF es un tercio más rápido que REPLACE.

también vea esto

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

puedes crear funciones

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
fuente
2

Prueba esto

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

Consigue el último personaje

Right(@string, len(@String) - (len(@String) - 1))
Sam
fuente
Sin embargo, no creo que esto sea lo que estaba preguntando; sin embargo, esto podría ser útil para hacer un comentario.
jimwise
3
justo (@string, 1).
Basado en el objetivo el
1

Mi respuesta es similar a la respuesta aceptada, pero también verifica la cadena vacía y nula.

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
fuente
1

Esto es bastante tarde, pero curiosamente nunca se mencionó todavía.

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

es decir:

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

Me encanta la respuesta de @ bill-hoenig; sin embargo, estaba usando una subconsulta y quedé atrapado porque la función REVERSE necesitaba dos conjuntos de paréntesis. ¡Me tomó un tiempo darme cuenta de eso!

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
fuente
Es posible que desee utilizar una solicitud externa / cruzada para la parte compuesta de la consulta. Estoy usando esto para obtener un conjunto de banderas para un elemento principal.
Rastreador1
0

Para actualizar el registro recortando los últimos N caracteres de una columna en particular:

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

Intentalo :

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

salida:

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

Prueba esto,

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

Y la salida será como, THAMIZHMANI

Thamizhmani
fuente
-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
fuente