Видалити останній символ у рядку в T-SQL?


139

Як видалити останній символ у рядку T-SQL?

Наприклад:

'TEST STRING'

повертати:

'TEST STRIN'

Відповіді:


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
Як варіант: ВИБІР ВЛИВО (YourColumnName, LEN (YourColumnName) - 1) ВІД YourTable
Kyle B.

3
Дякую за нульовий вилов - ISNULL (ЛІВО (@String, LEN (@String) - 1), 'ErrMsg') вирішить
Volvox

2
@Volvox все одно викине виняток, якщо рядок "Порожня струна", я змінюю вашу відповідь для обробки цього сценарію.
Імран Різві

106

Якщо чомусь ваша логіка стовпців є складною (випадок, коли ... тоді ... інше ... кінець), то наведені вище рішення змушують повторити ту саму логіку у функції len (). Дублювання тієї ж логіки стає безладом. Якщо це так, то це рішення, яке варто зазначити. Цей приклад позбавляється від останньої небажаної коми. Нарешті я знайшов застосування для функції ОБОВ'ЯЗКИ.

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

6
Зауважте, що цей код повертається, NULLякщо переданий рядок, коротший за діапазон видалення, визначений для STUFF. Загорніть його в, ISNULLщоб отримати інше значення виводу для корпусу порожнього рядка.
Розвель

11
Добре, використовуючи це із застосуванням із зовнішньою програмою, за допомогою шляху xml (''), щоб усунути копу. awseome
Tracker1

Також так само, як @ Tracker1. На відміну від усього, що стосується LEN (), це витончено працює (не повторюючи нічого) для порожнього рядка (особливо загорнутого в ISNULL ())
gregmac

Це дійсно чудово, наскільки жорстоким може бути іноді SQL. Це неймовірно.
eouw0o83hf

Дякую, мені це допомогло, у моєму випадку я мав останнє місце, тому перший індекс - 2select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Арнгуе

52

Спробуйте це:

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

@Adrien будь-яка ідея, чому це, здається, дає такий же результат, як і select substring('test string', 0, len('test string'))?
Луї Ваверу

@Louis, синтаксис подстрока виглядає наступним чином : SUBSTRING ( expression ,start , length ). Тепер обидва запити повертаються однаково, тому що нумерація заснована на 1, це означає, що перший символ у виразі дорівнює 1. Якщо старт менший за 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

Це працюватиме навіть тоді, коли вихідний текст / var є нульовим або порожнім:

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

2
Це занижений коментар, це швидко, і не потрібно двічі вибирати рядок для роботи.
Рандалл

7

Якщо ваша колонка є, textа ні varchar, ви можете скористатися цим:

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

5

Якщо ви хочете зробити це в два етапи, а не три з REVERSE-STUFF-REVERSE, ви можете мати роздільник списку один або два пробіли. Потім використовуйте RTRIM, щоб обрізати пробіли, а ЗАМЕНИТИ, щоб замінити подвійні пробіли на ","

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).
GoalBased

1

Моя відповідь схожа на прийняту відповідь, але вона також перевіряє наявність Null and 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

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.