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

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

例如:

'TEST STRING'

返回:

'TEST STRIN'
531443 次浏览

例如:。

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

试试这个:

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

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

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

如果你的字符串是空的,

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

然后这段代码将导致错误消息“传递给子字符串函数的长度参数无效”

你可以这样处理:

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

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

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

SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-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

如果您想在两个步骤中完成此操作,而不是三个 REVERSE-STUFF-REVERSE,那么您可以将列表分隔符设置为一个或两个空格。然后使用 RTRIM 修剪尾部空格,并用“ ,”替换双空格,

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

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

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

也请参阅 这个

拿到最后一个字符

Right(@string, len(@String) - (len(@String) - 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)

你可以创建函数

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

我的答案与已接受的答案类似,但它也检查 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

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

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
select left('TEST STRING', len('TEST STRING')-1)

试试这个

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

试试这个,

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

输出就像,THAMIZHMANI

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

我可以建议这样做-黑客-;)。

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

SQLServer 小提琴演示

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

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

这是相当晚,但有趣的是,从来没有提到。

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

即:

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

我遇到了这个问题,我的问题就这样解决了:

Declare @name as varchar(30)='TEST STRING'
Select left(@name, len(@name)-1) as AfterRemoveLastCharacter