2009-08-10 60 views

Respuesta

161

por ejemplo

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 
+46

alternativa: selecciona la izquierda (YourColumnName, LEN (YourColumnName) - 1) DE YourTable –

+6

Nota: esto genera un error si la cadena está vacía. – gregmac

+2

Gracias por la captura nula - ISNULL (LEFT (@String, LEN (@String) - 1), 'ErrMsg') resolverá – Volvox

35

Prueba esto:

select substring('test string', 1, (len('test string') - 1)) 
+0

@Adrien ¿Alguna idea de por qué esto parece dar el mismo resultado que 'seleccionar subcadena ('cadena de prueba', 0, len ('cadena de prueba'))'? – Louis

85

Si por alguna razón la lógica de la columna es complejo (caso cuando ... entonces ... otra cosa ... final), entonces las soluciones anteriores que provoca a tiene 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, esta es una solución que vale la pena señalar. 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, '')) 
+6

Tenga en cuenta que este código devuelve 'NULL' si pasa una cadena que es más corta que el intervalo de eliminación especificado para' STUFF'. Envuélvalo en un 'ISNULL' para obtener un valor de salida diferente para el caso de cadena vacía. – Rozwel

+11

Agradable, usando esto con una aplicación externa, con una ruta xml ('') para eliminar una coma al final. awseome – Tracker1

+0

También de la misma manera que @ Tracker1. A diferencia de cualquier cosa que involucre a LEN(), esto funciona con gracia (sin repetir nada) para cadenas vacías (especialmente envueltas en ISNULL()) – gregmac

19

Si la cadena está vacía,

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

entonces este código hará que el mensaje de error "parámetro de longitud no válida pasado a la función subcadena.

se puede manejar de esta manera:

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

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

5

Si su text de Coloumn es y no varchar, entonces usted puede utilizar esto:

SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1)) 
0

Me encanta @ respuesta factura-Hoenig 's; sin embargo, estaba usando una subconsulta y me quedé atrapado porque la función REVERSE necesitaba dos conjuntos de paréntesis. Me tomó un tiempo descubrirlo.

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

Es posible que desee utilizar una aplicación externa/cruzada para la parte compuesta de la consulta. Estoy usando esto para obtener un conjunto de banderas para un elemento principal. – Tracker1

5

Si usted quiere hacer esto en dos pasos, en lugar de los tres INVERSA MATERIA inversa, usted puede tener su lista separador sea uno o dos espacios. A continuación, utilice RTRIM para recortar los espacios finales, y reemplazar para sustituir los espacios dobles con ''

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

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

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

también ver this

1

Consigue el último carácter derecho (@string, len (@String) - (len (@String) - 1))

+0

No creo que esto sea lo que estaba preguntando, sin embargo, esto podría ser útil para hacer un comentario. – jimwise

+3

simplemente a la derecha (@string, 1). – GoalBased

-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+','[email protected] 
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) 
+0

Creo que las respuestas existentes ya cubren este método. – Sam

1

puede crear la función

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 
1

Mi respuesta es similar a la respuesta aceptada, pero también comprueba si hay cadenas nulas y vacías.

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 
0

para actualizar el registro por el recorte de los últimos N caracteres de una columna en particular:

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

Inténtelo:

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

de salida:

Tada 
-------------------- 
TEST STRIN 
4
select left('TEST STRING', len('TEST STRING')-1) 
1

Prueba este

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

probar esto,

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

Y la salida será como, THAMIZHMANI

1
@result = substring(@result, 1, (LEN(@result)-1)) 
Cuestiones relacionadas