Yanıtlar:
Örneğin
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
Herhangi bir nedenle sütun mantığınız karmaşıksa (o zaman ... o zaman ... başka ... son), yukarıdaki çözümler len () işlevinde aynı mantığı tekrarlamanıza neden olur. Aynı mantığı çoğaltmak karışıklık yaratır. Eğer durum buysa, bu kayda değer bir çözümdür. Bu örnek son istenmeyen virgülden kurtulur. Sonunda TERS işlevi için bir kullanım buldum.
select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))
NULL
Belirtilen silme aralığından daha kısa bir dize iletilirse bu kodun döndürüldüğünü unutmayın STUFF
. ISNULL
Boş dize kasası için farklı bir çıktı değeri elde etmek üzere bir öğesine sarın .
select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Bunu dene:
select substring('test string', 1, (len('test string') - 1))
select substring('test string', 0, len('test string'))
mu?
Dizeniz boşsa,
DECLARE @String VARCHAR(100)
SET @String = ''
SELECT LEFT(@String, LEN(@String) - 1)
bu kod 'Alt dize işlevine geçersiz uzunluk parametresi geçirildi' hata iletisine neden olur.
Bunu şu şekilde halledebilirsiniz:
SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
Her zaman sonuç döndürür ve boş dize durumunda NULL olur.
Bu, kaynak metin / var boş veya boş olsa bile çalışır:
SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
Kolonunuz text
değilse ve değilse varchar
, bunu kullanabilirsiniz:
SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
Bunu REVERSE-STUFF-REVERSE yerine üç adımda yapmak istiyorsanız, liste ayırıcısının bir veya iki boşluk olmasını sağlayabilirsiniz. Ardından arka boşlukları kırpmak için RTRIM kullanın ve çift boşlukları ',' ile değiştirmek için DEĞİŞTİRİN
select REPLACE(RTRIM('a b c d '),' ', ', ')
Ancak, orijinal dizeniz dahili boşluklar içerebiliyorsa, bu iyi bir fikir değildir.
Performans konusunda emin değilim. Her REVERSE, dizenin yeni bir kopyasını oluşturur, ancak STUFF, REPLACE'ten üçte bir daha hızlıdır.
ayrıca bunu gör
@result = substring(@result, 1, (LEN(@result)-1))
Bunu -hack-;) önerebilirim.
select
left(txt, abs(len(txt + ',') - 2))
from
t;
fonksiyon yaratabilirsiniz
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
Bunu dene
DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
Cevabım kabul edilen cevaba benzer, ancak aynı zamanda Boş ve Boş Dizeyi de kontrol eder.
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
Bu oldukça geç, ama ilginç bir şekilde henüz bahsedilmedi.
select stuff(x,len(x),1,'')
yani:
take a string x
go to its last character
remove one character
add nothing
@ Bill-hoenig'in cevabını seviyorum; ancak, bir alt sorgu kullanıyordum ve yakalandım çünkü TERS işlevinin iki parantez kümesine ihtiyacı vardı. Bunu çözmem için biraz zamanımı aldı!
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
Belirli bir sütunun son N karakterini kırparak kaydı güncellemek için:
UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause
Bunu dene,
DECLARE @name NVARCHAR(MAX) SET @name='xxxxTHAMIZHMANI****'SELECT Substring(@name, 5, (len(@name)-8)) as UserNames
Ve çıktı şöyle olacak, 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)