Rimuovere l'ultimo carattere in una stringa in T-SQL?


139

Come rimuovo l'ultimo carattere di una stringa in T-SQL?

Per esempio:

'TEST STRING'

ritornare:

'TEST STRIN'

Risposte:


195

per esempio

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

71
In alternativa: SELEZIONA SINISTRA (YourColumnName, LEN (YourColumnName) - 1) FROM YourTable
Kyle B.

3
Grazie per la cattura nulla - ISNULL (LEFT (@String, LEN (@String) - 1), "ErrMsg") risolverà
Volvox,

2
@Volvox genererà comunque un'eccezione se la stringa è Empty String, sto modificando la tua risposta per gestire questo scenario.
Imran Rizvi,

106

Se per qualche motivo la logica della tua colonna è complessa (caso in cui ... allora ... altrimenti ... fine), le soluzioni sopra riportate ti fanno ripetere la stessa logica nella funzione len (). La duplicazione della stessa logica diventa un disastro. In questo caso, questa è una soluzione degna di nota. Questo esempio elimina l'ultima virgola indesiderata. Alla fine ho trovato un uso per la funzione INVERSO.

select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))

6
Si noti che questo codice restituisce NULLse viene passata una stringa più corta dell'intervallo di eliminazione specificato per STUFF. Avvolgilo in un ISNULLper ottenere un valore di output diverso per il caso stringa vuota.
Rozwel,

11
Bello, usarlo con un applicare esterno, con un percorso per xml ('') per eliminare una virgola finale. awseome
Tracker1

Allo stesso modo di @ Tracker1. A differenza di qualsiasi cosa che coinvolga LEN (), questo funziona con grazia (senza ripetere nulla) per stringhe vuote (specialmente racchiuse in ISNULL ())
gregmac

È davvero straordinario quanto a volte possa essere brutale l'SQL. Questo è incredibile.
eouw0o83hf,

Grazie, mi ha aiutato, nel mio caso avevo un ultimo spazio, quindi il primo indice è 2select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Arngue

52

Prova questo:

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

@Adrien qualche idea del perché questo sembra dare lo stesso risultato di select substring('test string', 0, len('test string'))?
Louis Waweru,

@Louis, la sintassi è la seguente stringa: SUBSTRING ( expression ,start , length ). Ora, entrambe le query restituiscono lo stesso perché la numerazione è basata su 1, il che significa che il primo carattere nell'espressione è 1. Se start è inferiore a 1, l'espressione restituita inizierà dal primo carattere specificato nell'espressione. Fonte
JS5,

26

Se la tua stringa è vuota,

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

quindi questo codice causerà il messaggio di errore "Parametro di lunghezza non valido passato alla funzione di sottostringa".

Puoi gestirlo in questo modo:

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

Restituirà sempre il risultato e NULL in caso di stringa vuota.


10
select left('TEST STRING', len('TEST STRING')-1)

9

Funzionerà anche quando il testo di origine / var è nullo o vuoto:

SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))

2
Questo è un commento sottovalutato, è veloce e non deve selezionare la stringa due volte per funzionare.
Randall,

7

Se la tua colonna è texte no varchar, puoi usare questo:

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

5

Se si desidera eseguire questa operazione in due passaggi, anziché tre di REVERSE-STUFF-REVERSE, è possibile impostare il separatore di elenchi in uno o due spazi. Quindi utilizzare RTRIM per tagliare gli spazi finali e SOSTITUIRE per sostituire i doppi spazi con ","

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

Tuttavia, questa non è una buona idea se la stringa originale può contenere spazi interni.

Non sono sicuro delle prestazioni. Ogni REVERSE crea una nuova copia della stringa, ma STUFF è un terzo più veloce di REPLACE.

vedi anche questo




2

puoi creare una funzione

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

Prova questo

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

2

Ottieni l'ultimo personaggio

Right(@string, len(@String) - (len(@String) - 1))

Non penso che questo sia quello che stava chiedendo, tuttavia, potrebbe essere utile inserire un commento.
jimwise

3
giusto (@string, 1).
Obiettivo:

1

La mia risposta è simile alla risposta accettata, ma controlla anche 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

1

È abbastanza tardi, ma è interessante che non sia ancora stato menzionato.

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

vale a dire:

take a string x
go to its last character
remove one character
add nothing

0

Adoro la risposta di @ bill-hoenig; tuttavia, stavo usando una subquery e mi sono fatto prendere perché la funzione REVERSE aveva bisogno di due serie di parentesi. Mi ci è voluto un po 'per capirlo!

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

È possibile che si desideri utilizzare una domanda esterna / incrociata per la parte composita della query. Sto usando questo per ottenere un set di flag per un elemento genitore.
Tracker1

0

Per aggiornare il record tagliando gli ultimi N caratteri di una determinata colonna:

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

0

Provalo :

  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

produzione:

Tada
--------------------
TEST STRIN

0

Prova questo,

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

E l'uscita sarà come, THAMIZHMANI


-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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.