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

时间:2009-08-10 20:01:10

标签: sql sql-server tsql

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

例如:

'TEST STRING'

返回:

'TEST STRIN'

21 个答案:

答案 0 :(得分:178)

e.g。

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

答案 1 :(得分:95)

如果由于某种原因你的列逻辑很复杂(当......那么......其他......结束时),那么上面的解决方案会导致你必须在len()函数中重复相同的逻辑。复制相同的逻辑变得一团糟。如果是这种情况,那么这是一个值得注意的解决方案。此示例删除了最后一个不需要的逗号。我终于找到了REVERSE功能的用途。

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

答案 2 :(得分:41)

试试这个:

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

答案 3 :(得分:23)

如果您的字符串为空,

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

然后此代码将导致错误消息'传递给子字符串函数的长度参数无效。'

你可以这样处理:

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

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

答案 4 :(得分:7)

如果您的专栏是text而非varchar,那么您可以使用此列:

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

答案 5 :(得分:7)

select left('TEST STRING', len('TEST STRING')-1)

答案 6 :(得分:5)

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

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

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

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

另见this

答案 7 :(得分:5)

@result = substring(@result, 1, (LEN(@result)-1))

答案 8 :(得分:4)

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

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

SQL Server Fiddle Demo

答案 9 :(得分:3)

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

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

即:

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

答案 10 :(得分: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

答案 11 :(得分:2)

试试这个

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

答案 12 :(得分: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

答案 13 :(得分:1)

获取最后一个角色

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

答案 14 :(得分:1)

源文本/变量可以为null或为空:

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

答案 15 :(得分:0)

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

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

答案 16 :(得分:0)

试一试:

  DECLARE @String NVARCHAR(100)
    SET @String = '12354851'
    SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))

答案 17 :(得分:0)

declare @string varchar(20)= 'TEST STRING'
Select left(@string, len(@string)-1) as Tada

输出:

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

答案 18 :(得分:0)

试试这个,

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

输出就像THAMIZHMANI

答案 19 :(得分: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

答案 20 :(得分:-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)