T-SQL'de bir dizedeki son karakter kaldırılsın mı?


139

Bir dizedeki son karakteri nasıl kaldırabilirim T-SQL?

Örneğin:

'TEST STRING'

geri vermek:

'TEST STRIN'

Yanıtlar:


195

Ö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

71
Alternatif olarak: SOL SEÇİN (SütunAdınız, LEN (SütunAdınız) - 1) Masaüstünüzden
Kyle B.

3
Sıfır yakalama için teşekkürler - ISNULL (LEFT (@String, LEN (@String) - 1), 'ErrMsg') çözecek
Volvox

2
@Volvox hala String String ise istisna atacaktır, bu senaryoyu ele almak için cevabınızı değiştiriyorum.
Imran Rizvi

106

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

6
NULLBelirtilen silme aralığından daha kısa bir dize iletilirse bu kodun döndürüldüğünü unutmayın STUFF. ISNULLBoş dize kasası için farklı bir çıktı değeri elde etmek üzere bir öğesine sarın .
Rozwel

11
Güzel, bunu bir dış uygulama ile kullanarak, bir virgül kaldırmak için bir xml yolu ('') ile kullanın. awseome
Tracker1

@ Tracker1 ile aynı şekilde. LEN () içeren herhangi bir şeyden farklı olarak bu, boş bir dize (özellikle ISNULL () içinde sarılır) için zarif bir şekilde çalışır (hiçbir şeyi tekrarlamadan)
gregmac

SQL'in bazen ne kadar acımasız olabileceği gerçekten dikkat çekicidir. Bu inanılmaz.
eouw0o83hf

Teşekkürler, bana yardımcı oldu, benim durumumda bir son boşluk vardı, bu yüzden ilk endeks 2select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Arngue

52

Bunu dene:

select substring('test string', 1, (len('test string') - 1))

@Adrien bunun neden aynı sonucu verdiğini düşünüyor select substring('test string', 0, len('test string'))mu?
Louis Waweru

@Louis, alt dize sözdizimi aşağıdaki gibi olduğu: SUBSTRING ( expression ,start , length ). Şimdi, her iki sorgu da aynıdır çünkü numaralandırma 1 tabanlıdır, yani ifadedeki ilk karakter 1'dir. Başlangıç ​​1'den küçükse, döndürülen ifade ifadede belirtilen ilk karakterden başlar. Kaynak
JS5

26

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.



9

Bu, kaynak metin / var boş veya boş olsa bile çalışır:

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

2
Bu Underrated bir yorumdur, hızlıdır ve çalışmak için dizeyi iki kez seçmek zorunda değildir.
Randall

7

Kolonunuz textdeğilse ve değilse varchar, bunu kullanabilirsiniz:

SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))

5

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




2

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

2

Bunu dene

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

2

Son karakteri al

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

Yine de sorduğu şey bu değil sanırım - bu bir yorum yapmak için yararlı olabilir.
jimwise

3
just Right (@string, 1) Instagram Hesabında Takip Ettikleri
GoalBased

1

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

1

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

0

@ 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

Sorgunun bileşik kısmı için bir dış / çapraz uygulama kullanmak isteyebilirsiniz. Ben bir üst öğe için bayraklar kümesi almak için kullanıyorum.
Tracker1

0

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

0

Dene :

  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

çıktı:

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

0

Bunu dene,

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

Ve çıktı şöyle olacak, 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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.