Відповіді:
напр
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)