Удалить последний символ в строке в T-SQL?

Как удалить последний символ в строке в T-SQL?

Например:

'TEST STRING'

:

'TEST STRIN'

Ответ 1

например.

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

Ответ 2

Если по какой-то причине ваша логика столбца сложна (случай, когда... then... else... end), то приведенные выше решения заставляют вас повторять одну и ту же логику в функции len(). Дублирование одной и той же логики становится беспорядком. Если это так, то это решение стоит отметить. Этот пример избавляется от последней нежелательной запятой. Наконец, я нашел использование функции REVERSE.

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

Ответ 3

Попробуйте следующее:

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

Ответ 4

Если ваша строка пуста,

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

то этот код вызовет сообщение об ошибке "Неверный параметр длины передан функции подстроки".

Вы можете справиться с этим так:

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

Он всегда будет возвращать результат и NULL в случае пустой строки.

Ответ 5

Если ваш coloumn равен text, а не varchar, вы можете использовать это:

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

Ответ 6

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

Ответ 7

Если вы хотите сделать это за два шага, а не три из REVERSE-STUFF-REVERSE, вы можете иметь разделитель списков в одном или двух пробелах. Затем используйте RTRIM для обрезки конечных пробелов и REPLACE, чтобы заменить двойные пробелы на ","

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

Однако, это не очень хорошая идея, если ваша исходная строка может содержать внутренние пробелы.

Не уверен в производительности. Каждый REVERSE создает новую копию строки, но STUFF является третьим быстрее, чем REPLACE.

также см. this

Ответ 8

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

Ответ 9

Я могу предложить это взломать;).

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

SQL Server Fiddle Demo

Ответ 10

вы можете создать функцию

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

Попробуйте это

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

Ответ 12

Получить последний персонаж

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

Ответ 13

Мой ответ подобен принятому ответу, но он также проверяет строку Null и Empty.

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

Ответ 14

Я люблю @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

Ответ 15

Чтобы обновить запись, обрезая последние N символов определенного столбца:

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

Ответ 16

Попробуйте:

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

Ответ 17

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

выход:

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

Ответ 18

Попробуйте это,

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

И результат будет таким, как THAMIZHMANI

Ответ 19

Исходный текст /var может быть нулевым или пустым:

ВЫБРАТЬ ОБРАТНУЮ (ПОДПИСЬ (ОБРАТНАЯ (@a), 2, 9999))

Ответ 20

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+','[email protected]
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)