Hapus karakter terakhir dalam sebuah string di T-SQL?

139

Bagaimana cara menghapus karakter terakhir dalam string T-SQL?

Sebagai contoh:

'TEST STRING'

mengembalikan:

'TEST STRIN'
Daveed
sumber

Jawaban:

195

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
AdaTheDev
sumber
71
Atau: SELECT LEFT (YourColumnName, LEN (YourColumnName) - 1) DARI YourTable
Kyle B.
3
Terima kasih atas tangkapan nol - ISNULL (KIRI (@String, LEN (@String) - 1), 'ErrMsg') akan menyelesaikan
Volvox
2
@ Volvox masih akan melempar pengecualian jika string adalah String Kosong, saya mengubah jawaban Anda untuk menangani skenario ini.
Imran Rizvi
106

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, ''))
Bill Hoenig
sumber
6
Perhatikan bahwa kode ini kembali NULLjika melewati string yang lebih pendek dari rentang penghapusan yang ditentukan untuk STUFF. Bungkus dalam ISNULLuntuk mendapatkan nilai output yang berbeda untuk case string kosong.
Rozwel
11
Bagus, menggunakan ini dengan menerapkan luar, dengan path untuk xml ('') untuk menghilangkan koma tertinggal. awseome
Tracker1
Juga sama seperti @ Tracker1. Tidak seperti apa pun yang melibatkan LEN () ini bekerja dengan anggun (tanpa mengulangi apa pun) untuk string kosong (terutama dibungkus dengan ISNULL ())
gregmac
Sungguh luar biasa betapa brutalnya SQL terkadang. Ini luar biasa.
eouw0o83hf
Terima kasih, ini membantu saya, dalam kasus saya, saya memiliki ruang terakhir sehingga indeks pertama adalah 2select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Arngue
52

Coba ini:

select substring('test string', 1, (len('test string') - 1))
Adrien
sumber
@ Adrien tahu mengapa ini tampaknya memberikan hasil yang sama select substring('test string', 0, len('test string'))?
Louis Waweru
@Louis, sintaks substring adalah sebagai berikut: 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
JS5
26

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.

Max Grachev
sumber
10
select left('TEST STRING', len('TEST STRING')-1)
greg121
sumber
9

Ini akan berfungsi bahkan ketika teks sumber / var adalah nol atau kosong:

SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
David Roach
sumber
2
Ini adalah komentar Underrated, cepat dan tidak harus memilih string dua kali agar berfungsi.
Randall
7

Jika kolom Anda adalah textdan tidak varchar, maka Anda dapat menggunakan ini:

SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
MicBehrens
sumber
5

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

Daryl
sumber
5
@result = substring(@result, 1, (LEN(@result)-1))
saleem farrukh
sumber
5

Saya dapat menyarankan ini -hack-;).

select 
    left(txt, abs(len(txt + ',') - 2))
from 
    t;

Demo Server SQL Fiddle

shA.t
sumber
2

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
Mihail Katrikh
sumber
2

Coba ini

DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
Abhishek Jaiswal
sumber
2

Dapatkan karakter terakhir

Right(@string, len(@String) - (len(@String) - 1))
Sam
sumber
Tapi saya rasa ini bukan yang dia tanyakan - ini mungkin berguna untuk dimasukkan dalam komentar.
bersamaan
3
Tepat (@string, 1).
GoalBased
1

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
Imran Rizvi
sumber
1

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
George Menoutis
sumber
0

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
Hurleystylee
sumber
Anda mungkin ingin menggunakan bagian terluar / silang untuk bagian komposit dari kueri. Saya menggunakan ini untuk mendapatkan satu set bendera untuk item induk.
Pelacak1
0

Untuk memperbarui catatan dengan memotong N karakter terakhir dari kolom tertentu:

UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause
Manvendra_0611
sumber
0

Cobalah :

  DECLARE @String NVARCHAR(100)
    SET @String = '12354851'
    SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
Cabai
sumber
0
declare @string varchar(20)= 'TEST STRING'
Select left(@string, len(@string)-1) as Tada

keluaran:

Tada
--------------------
TEST STRIN
Migo
sumber
0

Coba ini,

DECLARE @name NVARCHAR(MAX) SET @name='xxxxTHAMIZHMANI****'SELECT Substring(@name, 5, (len(@name)-8)) as UserNames

Dan hasilnya akan seperti, THAMIZHMANI

Thamizhmani
sumber
-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)
Julie
sumber