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


139

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

例如:

'TEST STRING'

回来:

'TEST STRIN'

Answers:


195

例如

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
或者:从YourTable中选择LEFT(YourColumnName,LEN(YourColumnName)-1)
。2009年

3
感谢您的null捕获-ISNULL(LEFT(@String,LEN(@String)-1),'ErrMsg')将解决
Volvox

2
@Volvox,如果字符串为空字符串,它仍将引发异常,我正在修改您的答案以处理这种情况。
Imran Rizvi

106

如果由于某种原因您的列逻辑很复杂(情况是...那么... else ...结束),那么上述解决方案将使您不得不在len()函数中重复相同的逻辑。复制相同的逻辑变得一团糟。如果是这种情况,那么这是一个值得注意的解决方案。本示例摆脱了最后一个不需要的逗号。我终于找到了REVERSE函数的用途。

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

6
请注意,NULL如果传递的字符串比为所指定的删除范围短,则返回此代码STUFF。将其包装起来,ISNULL以获取空字符串大小写不同的输出值。
罗兹维尔2012年

11
很好,将其与外部apply一起使用,并带有for xml path('')以消除尾随逗号。awseome
Tracker1 2012年

也与@ Tracker1相同。与任何涉及LEN()的方法不同,它可以正常处理(无需重复任何操作)空字符串(特别是包装在ISNULL()中)
gregmac

有时候SQL多么残酷真是太了不起了。这难以置信。
eouw0o83hf

谢谢,这对我有所帮助,就我而言,我有最后一个空格,所以第一个索引是2select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Arngue

52

试试这个:

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

@Adrien知道为什么这看起来和结果一样select substring('test string', 0, len('test string'))吗?
Louis Waweru

@Louis,子字符串语法如下:SUBSTRING ( expression ,start , length )。现在,两个查询都返回相同的数字,因为编号是基于1的,这意味着表达式中的第一个字符为1。如果start小于1,则返回的表达式将从表达式中指定的第一个字符开始。来源
JS5

26

如果您的字串为空,

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

那么此代码将导致错误消息“无效的长度参数传递给子字符串函数”。

您可以这样处理:

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

它将始终返回结果,如果为空字符串则为NULL。



9

即使源text / var为null或为空,这也将起作用:

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

2
这是一个被低估的注释,它很快,而且不必两次选择字符串即可工作。
Randall

7

如果您的对话text不是varchar,则可以使用以下命令:

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

5

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

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

但是,如果原始字符串可以包含内部空格,则这不是一个好主意。

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

也看到这个




2

你可以创建功能

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

获取最后一个字符

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

不过,我认为这不是他要的,但是发表评论可能很有用。
jimwise

3
恰到好处(@string,1)。
基于

1

我的答案与接受的答案相似,但是它还会检查Null和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

这已经很晚了,但是有趣的是从未提及。

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

即:

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

0

我喜欢@ 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

您可能要对查询的复合部分使用外部/交叉申请。我正在使用它来获取父项的一组标志。
Tracker1 2013年

0

要通过修剪特定列的最后N个字符来更新记录,请执行以下操作:

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

0

试试吧 :

  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

输出:

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

0

试试这个,

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

输出将是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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.