Respostas:
por exemplo
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, por algum motivo, a lógica da sua coluna for complexa (caso em que ... então ... else ... end), as soluções acima farão com que você precise repetir a mesma lógica na função len (). Duplicar a mesma lógica se torna uma bagunça. Se for esse o caso, é uma solução digna de nota. Este exemplo se livra da última vírgula indesejada. Finalmente encontrei um uso para a função REVERSE.
select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))
NULL
se for passada uma string menor que o intervalo de exclusão especificado para STUFF
. Envolva-o em ISNULL
para obter um valor de saída diferente para o caso de string vazio.
select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Tente o seguinte:
select substring('test string', 1, (len('test string') - 1))
select substring('test string', 0, len('test string'))
?
SUBSTRING ( expression ,start , length )
. Agora, as duas consultas retornam o mesmo porque a numeração é baseada em 1, o que significa que o primeiro caractere na expressão é 1. Se o início for menor que 1, a expressão retornada começará no primeiro caractere especificado na expressão. Fonte
Se sua string estiver vazia,
DECLARE @String VARCHAR(100)
SET @String = ''
SELECT LEFT(@String, LEN(@String) - 1)
esse código causará a mensagem de erro 'Parâmetro de comprimento inválido passado para a função de substring'.
Você pode lidar com isso desta maneira:
SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
Ele sempre retornará resultado e NULL no caso de sequência vazia.
Isso funcionará mesmo quando o texto de origem / var for nulo ou vazio:
SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
Se sua cor é text
e não varchar
, você pode usar o seguinte:
SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
Se você quiser fazer isso em duas etapas, em vez das três de REVERSE-STUFF-REVERSE, poderá separar sua lista em um ou dois espaços. Em seguida, use RTRIM para aparar os espaços finais e REPLACE para substituir os espaços duplos por ','
select REPLACE(RTRIM('a b c d '),' ', ', ')
No entanto, isso não é uma boa ideia se a string original puder conter espaços internos.
Não tenho certeza sobre o desempenho. Cada REVERSE cria uma nova cópia da string, mas STUFF é um terço mais rápido que REPLACE.
veja também isso
@result = substring(@result, 1, (LEN(@result)-1))
Eu posso sugerir isso -hack-;).
select
left(txt, abs(len(txt + ',') - 2))
from
t;
você pode criar função
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
Tente isto
DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
Obter o último caractere
Right(@string, len(@String) - (len(@String) - 1))
Minha resposta é semelhante à resposta aceita, mas também verifica se há 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
É bastante tarde, mas curiosamente ainda não foi mencionado.
select stuff(x,len(x),1,'')
ou seja:
take a string x
go to its last character
remove one character
add nothing
Adoro a resposta de @ bill-hoenig; no entanto, eu estava usando uma subconsulta e fui pego porque a função REVERSE precisava de dois conjuntos de parênteses. Levei um tempo para descobrir isso!
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 atualizar o registro aparando os últimos N caracteres de uma coluna específica:
UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause
Tente isso,
DECLARE @name NVARCHAR(MAX) SET @name='xxxxTHAMIZHMANI****'SELECT Substring(@name, 5, (len(@name)-8)) as UserNames
E a saída 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)