Удалить последний символ в строке в T-SQL? - PullRequest
127 голосов
/ 11 августа 2009

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

Например:

'TEST STRING'

чтобы вернуть:

'TEST STRIN'

Ответы [ 20 ]

179 голосов
/ 11 августа 2009

1001 *, например *

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
97 голосов
/ 02 февраля 2012

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

select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))
41 голосов
/ 11 августа 2009

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

select substring('test string', 1, (len('test string') - 1))
23 голосов
/ 28 апреля 2012

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

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

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

Вы можете справиться с этим следующим образом:

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

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

8 голосов
/ 20 ноября 2015
select left('TEST STRING', len('TEST STRING')-1)
7 голосов
/ 22 мая 2012

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

SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
5 голосов
/ 03 августа 2017
@result = substring(@result, 1, (LEN(@result)-1))
5 голосов
/ 02 октября 2012

Если вы хотите сделать это в два шага, а не в трех из REVERSE-STUFF-REVERSE, вы можете использовать разделитель списка с одним или двумя пробелами. Затем используйте RTRIM, чтобы обрезать завершающие пробелы, и ЗАМЕНИТЕ, чтобы заменить двойные пробелы на ','

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

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

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

см. Также это

4 голосов
/ 15 августа 2017

Я могу предложить это -hack-;).

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

Демонстрация скрипта SQL Server

2 голосов
/ 19 октября 2016

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

DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...