Jawaban:
misalnya
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
Jika karena alasan tertentu logika kolom Anda kompleks (kasus ketika ... lalu ... lain ... akhir), maka solusi di atas menyebabkan Anda harus mengulangi logika yang sama dalam fungsi len (). Menggandakan logika yang sama menjadi berantakan. Jika ini masalahnya maka ini adalah solusi yang perlu diperhatikan. Contoh ini menghilangkan koma yang tidak diinginkan terakhir. Saya akhirnya menemukan penggunaan untuk fungsi REVERSE.
select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))
NULL
jika melewati string yang lebih pendek dari rentang penghapusan yang ditentukan untuk STUFF
. Bungkus dalam ISNULL
untuk mendapatkan nilai output yang berbeda untuk case string kosong.
select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Coba ini:
select substring('test string', 1, (len('test string') - 1))
select substring('test string', 0, len('test string'))
?
SUBSTRING ( expression ,start , length )
. Sekarang, kedua kueri mengembalikan sama karena penomoran adalah berdasarkan 1, yang berarti bahwa karakter pertama dalam ekspresi adalah 1. Jika mulai kurang dari 1, ekspresi yang dikembalikan akan dimulai pada karakter pertama yang ditentukan dalam ekspresi. Sumber
Jika string Anda kosong,
DECLARE @String VARCHAR(100)
SET @String = ''
SELECT LEFT(@String, LEN(@String) - 1)
maka kode ini akan menyebabkan pesan kesalahan 'Parameter panjang tidak valid diteruskan ke fungsi substring.'
Anda bisa mengatasinya dengan cara ini:
SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
Itu akan selalu mengembalikan hasil, dan NULL dalam kasus string kosong.
Ini akan berfungsi bahkan ketika teks sumber / var adalah nol atau kosong:
SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
Jika kolom Anda adalah text
dan tidak varchar
, maka Anda dapat menggunakan ini:
SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
Jika Anda ingin melakukan ini dalam dua langkah, daripada tiga dari REVERSE-STUFF-REVERSE, Anda dapat membuat pemisah daftar Anda menjadi satu atau dua spasi. Kemudian gunakan RTRIM untuk memotong spasi tambahan, dan REPLACE untuk mengganti spasi ganda dengan ','
select REPLACE(RTRIM('a b c d '),' ', ', ')
Namun, ini bukan ide yang baik jika string asli Anda dapat berisi spasi internal.
Tidak yakin dengan kinerja. Setiap REVERSE membuat salinan baru dari string, tetapi STUFF adalah yang ketiga lebih cepat dari REPLACE.
juga lihat ini
@result = substring(@result, 1, (LEN(@result)-1))
Saya dapat menyarankan ini -hack-;).
select
left(txt, abs(len(txt + ',') - 2))
from
t;
Anda dapat membuat fungsi
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
Coba ini
DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
Jawaban saya mirip dengan jawaban yang diterima, tetapi juga memeriksa Null dan String Kosong.
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
Ini agak terlambat, tetapi yang menarik belum pernah disebutkan.
select stuff(x,len(x),1,'')
yaitu:
take a string x
go to its last character
remove one character
add nothing
Saya suka jawaban @ bill-hoenig; Namun, saya menggunakan subquery dan saya terjebak karena fungsi REVERSE membutuhkan dua set tanda kurung. Butuh waktu beberapa saat untuk memikirkannya!
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
Untuk memperbarui catatan dengan memotong N karakter terakhir dari kolom tertentu:
UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause
Coba ini,
DECLARE @name NVARCHAR(MAX) SET @name='xxxxTHAMIZHMANI****'SELECT Substring(@name, 5, (len(@name)-8)) as UserNames
Dan hasilnya akan seperti, 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)