删除T-SQL中string中的最后一个字符?

如何删除T-SQLstring的最后一个字符?

例如:

 'TEST STRING' 

回来:

 'TEST STRIN' 

例如

 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 

如果由于某种原因,你的列逻辑是复杂的(如果… then … else … end),那么上述解决scheme将导致你不得不在len()函数中重复相同的逻辑。 复制相同的逻辑变得混乱。 如果是这样的话,这是一个值得注意的解决scheme。 这个例子摆脱了最后一个不需要的逗号。 我终于find了REVERSE函数的用法。

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

尝试这个:

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

如果你的string是空的,

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

那么这段代码将会导致错误信息“无效的长度parameter passing给子串函数”。

你可以这样处理:

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

它将始终返回结果,并在空string的情况下为NULL。

如果你想分两步做,而不是REVERSE-STUFF-REVERSE三个,你可以让你的列表分隔符是一个或两个空格。 然后使用RTRIM修剪尾部空格,并用“,”replace双空格,

 select REPLACE(RTRIM('abcd '),' ', ', ') 

但是,如果您的原始string可以包含内部空格,这不是一个好主意。

不确定的performance。 每个REVERSE创build一个string的新副本,但STUFF比REPLACE快三分之一。

也看到这个

如果你的coloumn是text而不是varchar ,那么你可以使用这个:

 SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1)) 
 select left('TEST STRING', len('TEST STRING')-1) 

我可以build议这个-hack-;)。

 select left(txt, abs(len(txt + ',') - 2)) from t; 

SQL Server小提琴演示

获取最后一个字符正确(@string,len(@String) – (len(@String) – 1))

你可以创buildfunction

 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 

尝试这个

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

我爱@ bill-hoenig的答案; 然而,我正在使用一个子查询,我赶上了因为​​REVERSE函数需要两组括号。 花了我一段时间来找出那一个!

 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 

我的答案类似于接受的答案,但它也检查空string和空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 

通过修剪特定列的最后N个字符来更新logging:

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

尝试一下 :

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

输出:

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

尝试这个,

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

和输出将像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)