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

Dav*_*eed 133 sql t-sql sql-server

如何删除字符串中的最后一个字符T-SQL

例如:

'TEST STRING'
Run Code Online (Sandbox Code Playgroud)

回来:

'TEST STRIN'
Run Code Online (Sandbox Code Playgroud)

Ada*_*Dev 187

例如

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
Run Code Online (Sandbox Code Playgroud)

  • 或者:SELECT LEFT(YourColumnName,LEN(YourColumnName) - 1)FROM YourTable (67认同)
  • 请注意,如果您的字符串为空,则会引发错误. (8认同)
  • 感谢null catch - ISNULL(左(@ String,LEN(@String) - 1),'ErrMsg')将解决 (3认同)
  • 这也适用于`set @String = STUFF(@ String,1,1,'')` (3认同)
  • @Volvox如果字符串是空字符串,它仍然会抛出异常,我正在修改你的答案来处理这种情况. (2认同)

小智 98

如果由于某种原因,你的列逻辑是复杂的(情况下... THEN ... ELSE ... END),那么上面的解决方案,使你不得不重复同样的逻辑在LEN()函数.复制相同的逻辑变得一团糟.如果是这种情况,那么这是一个值得注意的解决方案.此示例删除了最后一个不需要的逗号.我终于找到了REVERSE功能的用途.

select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))
Run Code Online (Sandbox Code Playgroud)

  • 很好,使用外部应用,使用for xml路径('')来消除尾随逗号.awseome (11认同)
  • 请注意,如果传递的字符串短于为`STUFF`指定的删除范围,则此代码返回"NULL".将它包装在`ISNULL`中以获得空字符串大小写的不同输出值. (6认同)

Adr*_*ien 46

试试这个:

select substring('test string', 1, (len('test string') - 1))
Run Code Online (Sandbox Code Playgroud)


小智 25

如果你的字符串是空的,

DECLARE @String VARCHAR(100)
SET @String = ''
SELECT LEFT(@String, LEN(@String) - 1)
Run Code Online (Sandbox Code Playgroud)

那么这段代码将导致错误消息'传递给子字符串函数的长度参数无效.'

你可以这样处理它:

SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
Run Code Online (Sandbox Code Playgroud)

它将始终返回结果,并且在空字符串的情况下为NULL.


Dav*_*ach 17

即使源文本/var 为空或为空,这也能工作:

SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
Run Code Online (Sandbox Code Playgroud)

  • 这是一个被低估的评论,速度很快,而且不必选择两次字符串即可工作。 (2认同)

gre*_*121 9

select left('TEST STRING', len('TEST STRING')-1)
Run Code Online (Sandbox Code Playgroud)


Beh*_*ens 7

如果您的coloumn是text和否varchar,那么您可以使用:

SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
Run Code Online (Sandbox Code Playgroud)


小智 5

如果要分两步执行此操作,而不是REVERSE-STUFF-REVERSE中的三个,则可以将列表分隔符设置为一个或两个空格.然后使用RTRIM修剪尾随空格,并使用REPLACE替换','替换双空格

select REPLACE(RTRIM('a  b  c  d  '),'  ', ', ')
Run Code Online (Sandbox Code Playgroud)

但是,如果您的原始字符串可以包含内部空格,那么这不是一个好主意.

不确定性能.每个REVERSE都会创建一个新的字符串副本,但STUFF比REPLACE快三分之一.

也看到这个


小智 5

@result = substring(@result, 1, (LEN(@result)-1))
Run Code Online (Sandbox Code Playgroud)


shA*_*A.t 5

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

select 
    left(txt, abs(len(txt + ',') - 2))
from 
    t;
Run Code Online (Sandbox Code Playgroud)

SQL Server小提琴演示


Geo*_*tis 5

这已经很晚了,但有趣的是还没有提到。

select stuff(x,len(x),1,'')
Run Code Online (Sandbox Code Playgroud)

IE:

take a string x
go to its last character
remove one character
add nothing
Run Code Online (Sandbox Code Playgroud)