Respuestas:
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
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, ''))
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.
select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Prueba esto:
select substring('test string', 1, (len('test string') - 1))
select substring('test string', 0, len('test string'))?
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
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.
Esto funcionará incluso cuando el texto fuente / var sea nulo o vacío:
SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
Si su coloumn es texty no varchar, entonces puede usar esto:
SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
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
@result = substring(@result, 1, (LEN(@result)-1))
Puedo sugerir esto -hack-;).
select
left(txt, abs(len(txt + ',') - 2))
from
t;
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
Prueba esto
DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
Consigue el último personaje
Right(@string, len(@String) - (len(@String) - 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
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
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
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
Prueba esto,
DECLARE @name NVARCHAR(MAX) SET @name='xxxxTHAMIZHMANI****'SELECT Substring(@name, 5, (len(@name)-8)) as UserNames
Y la salida será como, THAMIZHMANI
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)