Відповіді:
напр
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
Якщо чомусь ваша логіка стовпців є складною (випадок, коли ... тоді ... інше ... кінець), то наведені вище рішення змушують повторити ту саму логіку у функції len (). Дублювання тієї ж логіки стає безладом. Якщо це так, то це рішення, яке варто зазначити. Цей приклад позбавляється від останньої небажаної коми. Нарешті я знайшов застосування для функції ОБОВ'ЯЗКИ.
select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))
NULLякщо переданий рядок, коротший за діапазон видалення, визначений для STUFF. Загорніть його в, ISNULLщоб отримати інше значення виводу для корпусу порожнього рядка.
select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Спробуйте це:
select substring('test string', 1, (len('test string') - 1))
select substring('test string', 0, len('test string'))?
SUBSTRING ( expression ,start , length ). Тепер обидва запити повертаються однаково, тому що нумерація заснована на 1, це означає, що перший символ у виразі дорівнює 1. Якщо старт менший за 1, повернений вираз розпочнеться з першого символу, який вказаний у виразі. Джерело
Якщо рядок порожній,
DECLARE @String VARCHAR(100)
SET @String = ''
SELECT LEFT(@String, LEN(@String) - 1)
тоді цей код спричинить повідомлення про помилку "Недійсний параметр довжини, переданий функції підрядки".
Ви можете впоратися з цим так:
SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
Він завжди буде повертати результат, а в разі порожнього рядка - NULL.
Це працюватиме навіть тоді, коли вихідний текст / var є нульовим або порожнім:
SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
Якщо ваша колонка є, textа ні varchar, ви можете скористатися цим:
SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
Якщо ви хочете зробити це в два етапи, а не три з REVERSE-STUFF-REVERSE, ви можете мати роздільник списку один або два пробіли. Потім використовуйте RTRIM, щоб обрізати пробіли, а ЗАМЕНИТИ, щоб замінити подвійні пробіли на ","
select REPLACE(RTRIM('a b c d '),' ', ', ')
Однак це не гарна ідея, якщо ваша оригінальна рядок може містити внутрішні пробіли.
Не впевнений у продуктивності. Кожен REVERSE створює нову копію рядка, але STUFF на третину швидше за REPLACE.
також бачимо це
@result = substring(@result, 1, (LEN(@result)-1))
Я можу запропонувати це -hack-;).
select
left(txt, abs(len(txt + ',') - 2))
from
t;
ви можете створити функцію
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
Спробуйте це
DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
Моя відповідь схожа на прийняту відповідь, але вона також перевіряє наявність 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
Це досить пізно, але цікаво ще ніколи не згадувалося.
select stuff(x,len(x),1,'')
тобто:
take a string x
go to its last character
remove one character
add nothing
Я люблю відповідь @ 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
Щоб оновити запис, обрізавши останні N символів певного стовпця:
UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause
Спробуйте це,
DECLARE @name NVARCHAR(MAX) SET @name='xxxxTHAMIZHMANI****'SELECT Substring(@name, 5, (len(@name)-8)) as UserNames
І вихід буде подібний, THAMIZHMANI
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)