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'

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

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, ''))

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 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.



9

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

SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))

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))

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




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

2

Coba ini

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

2

Dapatkan karakter terakhir

Right(@string, len(@String) - (len(@String) - 1))

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

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

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

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

0

Cobalah :

  DECLARE @String NVARCHAR(100)
    SET @String = '12354851'
    SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))

0
declare @string varchar(20)= 'TEST STRING'
Select left(@string, len(@string)-1) as Tada

keluaran:

Tada
--------------------
TEST STRIN

0

Coba ini,

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

Dan hasilnya akan seperti, THAMIZHMANI


-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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.