ฉันจะลบอักขระตัวสุดท้ายในสตริงได้T-SQL
อย่างไร?
ตัวอย่างเช่น:
'TEST STRING'
เพื่อกลับไป:
'TEST STRIN'
ฉันจะลบอักขระตัวสุดท้ายในสตริงได้T-SQL
อย่างไร?
ตัวอย่างเช่น:
'TEST STRING'
เพื่อกลับไป:
'TEST STRIN'
คำตอบ:
เช่น
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
ถ้าด้วยเหตุผลบางประการลอจิกคอลัมน์ของคุณซับซ้อน (กรณีเมื่อ ... แล้ว ... อื่น ... สิ้นสุด) การแก้ปัญหาข้างต้นทำให้คุณต้องทำซ้ำตรรกะเดียวกันในฟังก์ชั่น len () การทำซ้ำตรรกะเดียวกันจะกลายเป็นระเบียบ หากเป็นกรณีนี้นี่เป็นวิธีแก้ปัญหาที่ควรค่าแก่การสังเกต ตัวอย่างนี้กำจัดเครื่องหมายจุลภาคที่ไม่ต้องการล่าสุด ในที่สุดฉันก็พบการใช้งานฟังก์ชั่น REVERSE
select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))
NULL
STUFF
ล้อมรอบในISNULL
เพื่อรับค่าเอาต์พุตอื่นสำหรับเคสสตริงว่าง
select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
ลองสิ่งนี้:
select substring('test string', 1, (len('test string') - 1))
select substring('test string', 0, len('test string'))
หรือไม่
ถ้าสตริงของคุณว่างเปล่า
DECLARE @String VARCHAR(100)
SET @String = ''
SELECT LEFT(@String, LEN(@String) - 1)
รหัสนี้จะทำให้เกิดข้อผิดพลาด 'พารามิเตอร์ความยาวไม่ถูกต้องถูกส่งผ่านไปยังฟังก์ชั่นย่อย'
คุณสามารถจัดการได้ด้วยวิธีนี้:
SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
มันจะส่งคืนผลลัพธ์เสมอและเป็น NULL ในกรณีที่เป็นสตริงว่าง
select left('TEST STRING', len('TEST STRING')-1)
สิ่งนี้จะใช้ได้แม้ว่าข้อความต้นฉบับ / var จะเป็นโมฆะหรือว่างเปล่า:
SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))
หาก coloumn ของคุณใช่text
และไม่ใช่varchar
คุณสามารถใช้สิ่งนี้:
SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))
หากคุณต้องการทำสิ่งนี้ในสองขั้นตอนแทนที่จะเป็นสาม REVERSE-STUFF-REVERSE คุณสามารถให้ตัวแยกรายการของคุณเป็นหนึ่งหรือสองช่องว่าง จากนั้นใช้ RTRIM เพื่อตัดช่องว่างต่อท้ายและ REPLACE เพื่อแทนที่ช่องว่างคู่ด้วย ','
select REPLACE(RTRIM('a b c d '),' ', ', ')
อย่างไรก็ตามนี่ไม่ใช่ความคิดที่ดีถ้าสตริงต้นฉบับของคุณสามารถมีช่องว่างภายในได้
ไม่แน่ใจเกี่ยวกับประสิทธิภาพ REVERSE แต่ละอันสร้างสำเนาใหม่ของสตริง แต่ STUFF นั้นเร็วกว่า REPLACE ที่สาม
ยังเห็นสิ่งนี้
@result = substring(@result, 1, (LEN(@result)-1))
ฉันสามารถแนะนำ -hack- นี้;)
select
left(txt, abs(len(txt + ',') - 2))
from
t;
คุณสามารถสร้างฟังก์ชั่น
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
ลองสิ่งนี้
DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
คำตอบของฉันคล้ายกับคำตอบที่ยอมรับ แต่ตรวจสอบด้วย 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
มันค่อนข้างช้า แต่ก็ยังไม่ได้กล่าวถึงที่น่าสนใจ
select stuff(x,len(x),1,'')
เช่น:
take a string x
go to its last character
remove one character
add nothing
ฉันชอบคำตอบของ @ 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
หากต้องการอัปเดตระเบียนโดยตัดแต่งอักขระ N ตัวสุดท้ายของคอลัมน์ใดคอลัมน์หนึ่ง:
UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause
ลองมัน :
DECLARE @String NVARCHAR(100)
SET @String = '12354851'
SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
declare @string varchar(20)= 'TEST STRING'
Select left(@string, len(@string)-1) as Tada
เอาท์พุท:
Tada
--------------------
TEST STRIN
ลองนี้
DECLARE @name NVARCHAR(MAX) SET @name='xxxxTHAMIZHMANI****'SELECT Substring(@name, 5, (len(@name)-8)) as UserNames
และผลลัพธ์ก็จะเป็นเช่น 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)