Видалити останній символ у рядку в 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.