Risposte:
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
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, ''))
NULL
se viene passata una stringa più corta dell'intervallo di eliminazione specificato per STUFF
. Avvolgilo in un ISNULL
per ottenere un valore di output diverso per il caso stringa vuota.
select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Prova questo:
select substring('test string', 1, (len('test string') - 1))
select substring('test string', 0, len('test string'))
?
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
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.
Funzionerà anche quando il testo di origine / var è nullo o vuoto:
SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
Se la tua colonna è text
e no varchar
, puoi usare questo:
SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
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
@result = substring(@result, 1, (LEN(@result)-1))
Posso suggerire questo -hack-;).
select
left(txt, abs(len(txt + ',') - 2))
from
t;
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
Prova questo
DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
Ottieni l'ultimo personaggio
Right(@string, len(@String) - (len(@String) - 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
È 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
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
Per aggiornare il record tagliando gli ultimi N caratteri di una determinata colonna:
UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause
Provalo :
DECLARE @String NVARCHAR(100)
SET @String = '12354851'
SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
Prova questo,
DECLARE @name NVARCHAR(MAX) SET @name='xxxxTHAMIZHMANI****'SELECT Substring(@name, 5, (len(@name)-8)) as UserNames
E l'uscita sarà come, 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)