ลบอักขระตัวสุดท้ายในสตริงใน T-SQL หรือไม่


139

ฉันจะลบอักขระตัวสุดท้ายในสตริงได้T-SQLอย่างไร?

ตัวอย่างเช่น:

'TEST STRING'

เพื่อกลับไป:

'TEST STRIN'

คำตอบ:


195

เช่น

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
อีกทางเลือกหนึ่ง: เลือกซ้าย (YourColumnName, LEN (YourColumnName) - 1) จาก YourTable
Kyle B.

3
ขอบคุณสำหรับการจับ null - ISNULL (ซ้าย (@String, LEN (@String) - 1) 'ErrMsg') จะแก้ปัญหา
Volvox

2
@Volvox จะยังคงมีข้อยกเว้นหากสตริงเป็นสตริงว่างเปล่าฉันกำลังแก้ไขคำตอบของคุณเพื่อจัดการสถานการณ์นี้
Imran Rizvi

106

ถ้าด้วยเหตุผลบางประการลอจิกคอลัมน์ของคุณซับซ้อน (กรณีเมื่อ ... แล้ว ... อื่น ... สิ้นสุด) การแก้ปัญหาข้างต้นทำให้คุณต้องทำซ้ำตรรกะเดียวกันในฟังก์ชั่น len () การทำซ้ำตรรกะเดียวกันจะกลายเป็นระเบียบ หากเป็นกรณีนี้นี่เป็นวิธีแก้ปัญหาที่ควรค่าแก่การสังเกต ตัวอย่างนี้กำจัดเครื่องหมายจุลภาคที่ไม่ต้องการล่าสุด ในที่สุดฉันก็พบการใช้งานฟังก์ชั่น REVERSE

select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))

6
โปรดทราบว่าผลตอบแทนที่รหัสนี้ถ้าผ่านสตริงที่สั้นกว่าช่วงลบระบุสำหรับNULL STUFFล้อมรอบในISNULLเพื่อรับค่าเอาต์พุตอื่นสำหรับเคสสตริงว่าง
Rozwel

11
ดีใช้สิ่งนี้กับการใช้งานด้านนอกด้วยสำหรับเส้นทาง xml ('') เพื่อกำจัดเครื่องหมายจุลภาคต่อท้าย awseome
Tracker1

เช่นเดียวกับ @ Tracker1 ซึ่งแตกต่างจากสิ่งที่เกี่ยวข้องกับ LEN () นี้ทำงานได้อย่างสง่างาม (โดยไม่ต้องทำซ้ำอะไร) สำหรับสตริงที่ว่างเปล่า (โดยเฉพาะอย่างยิ่งห่อใน ISNULL ())
gregmac

เป็นที่น่าทึ่งจริงๆว่า SQL ที่โหดร้ายสามารถเกิดขึ้นได้อย่างไร นี่เป็นเรื่องเหลือเชื่อ
eouw0o83hf

ขอบคุณมันช่วยฉันในกรณีของฉันฉันมีพื้นที่สุดท้ายดังนั้นดัชนีแรกคือ 2select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Arngue

52

ลองสิ่งนี้:

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

@ เพิ่มแนวคิดใด ๆ ที่ทำให้สิ่งนี้ดูเหมือนจะให้ผลลัพธ์เหมือนกันselect substring('test string', 0, len('test string'))หรือไม่
Louis Waweru

@Louis SUBSTRING ( expression ,start , length )ไวยากรณ์ย่อยเป็นดังนี้ ตอนนี้เคียวรีทั้งสองคืนค่าเหมือนกันเนื่องจากการกำหนดหมายเลขเป็น 1 ซึ่งหมายความว่าอักขระตัวแรกในนิพจน์คือ 1 หากการเริ่มต้นน้อยกว่า 1 นิพจน์ที่ส่งคืนจะเริ่มต้นที่อักขระตัวแรกที่ระบุในนิพจน์ ที่มา
JS5

26

ถ้าสตริงของคุณว่างเปล่า

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

รหัสนี้จะทำให้เกิดข้อผิดพลาด 'พารามิเตอร์ความยาวไม่ถูกต้องถูกส่งผ่านไปยังฟังก์ชั่นย่อย'

คุณสามารถจัดการได้ด้วยวิธีนี้:

SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))

มันจะส่งคืนผลลัพธ์เสมอและเป็น NULL ในกรณีที่เป็นสตริงว่าง



9

สิ่งนี้จะใช้ได้แม้ว่าข้อความต้นฉบับ / var จะเป็นโมฆะหรือว่างเปล่า:

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

2
นี่เป็นความคิดเห็นที่ประเมินราคาต่ำและไม่จำเป็นต้องเลือกสตริงสองครั้งเพื่อทำงาน
Randall

7

หาก coloumn ของคุณใช่textและไม่ใช่varcharคุณสามารถใช้สิ่งนี้:

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

5

หากคุณต้องการทำสิ่งนี้ในสองขั้นตอนแทนที่จะเป็นสาม REVERSE-STUFF-REVERSE คุณสามารถให้ตัวแยกรายการของคุณเป็นหนึ่งหรือสองช่องว่าง จากนั้นใช้ RTRIM เพื่อตัดช่องว่างต่อท้ายและ REPLACE เพื่อแทนที่ช่องว่างคู่ด้วย ','

select REPLACE(RTRIM('a  b  c  d  '),'  ', ', ')

อย่างไรก็ตามนี่ไม่ใช่ความคิดที่ดีถ้าสตริงต้นฉบับของคุณสามารถมีช่องว่างภายในได้

ไม่แน่ใจเกี่ยวกับประสิทธิภาพ REVERSE แต่ละอันสร้างสำเนาใหม่ของสตริง แต่ STUFF นั้นเร็วกว่า REPLACE ที่สาม

ยังเห็นสิ่งนี้




2

คุณสามารถสร้างฟังก์ชั่น

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

รับตัวละครตัวสุดท้าย

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

ฉันไม่คิดว่านี่คือสิ่งที่เขาขอ แต่นี่อาจเป็นประโยชน์ในการแสดงความคิดเห็น
jimwise

3
เพียงแค่ถูกต้อง (@string, 1)
GoalBased

1

คำตอบของฉันคล้ายกับคำตอบที่ยอมรับ แต่ตรวจสอบด้วย Null และ Empty String

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

มันค่อนข้างช้า แต่ก็ยังไม่ได้กล่าวถึงที่น่าสนใจ

select stuff(x,len(x),1,'')

เช่น:

take a string x
go to its last character
remove one character
add nothing

0

ฉันชอบคำตอบของ @ bill-hoenig; อย่างไรก็ตามฉันกำลังใช้แบบสอบถามย่อยและฉันถูกตามเนื่องจากฟังก์ชัน REVERSE ต้องการวงเล็บสองชุด เอาฉันไปสักพักเพื่อหาอันนั้น!

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

คุณอาจต้องการใช้ outer / cross ใช้สำหรับคอมโพสิตส่วนของแบบสอบถาม ฉันใช้สิ่งนี้เพื่อรับชุดธงสำหรับรายการหลัก
Tracker1

0

หากต้องการอัปเดตระเบียนโดยตัดแต่งอักขระ N ตัวสุดท้ายของคอลัมน์ใดคอลัมน์หนึ่ง:

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


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

เอาท์พุท:

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

0

ลองนี้

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

และผลลัพธ์ก็จะเป็นเช่น 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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.