Xóa ký tự cuối cùng trong một chuỗi trong T-SQL?


139

Làm cách nào để xóa ký tự cuối cùng trong chuỗi T-SQL?

Ví dụ:

'TEST STRING'

trở về:

'TEST STRIN'

Câu trả lời:


195

ví dụ

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
Ngoài ra: CHỌN TRÁI (YourColumnName, LEN (YourColumnName) - 1) TỪ YourTable
Kyle B.

3
Cảm ơn bạn đã bắt được null - ISNULL (LEFT (@String, LEN (@String) - 1), 'ErrMsg') sẽ giải quyết
Volvox

2
@Volvox nó vẫn sẽ ném ngoại lệ nếu chuỗi là Chuỗi rỗng, tôi đang sửa đổi câu trả lời của bạn để xử lý tình huống này.
Imran Rizvi

106

Nếu vì một lý do nào đó, logic cột của bạn phức tạp (trong trường hợp khi ... thì ... khác ... kết thúc), thì các giải pháp trên khiến bạn phải lặp lại logic tương tự trong hàm len (). Sao chép cùng một logic trở thành một mớ hỗn độn. Nếu đây là trường hợp thì đây là một giải pháp đáng chú ý. Ví dụ này được loại bỏ dấu phẩy không mong muốn cuối cùng. Cuối cùng tôi đã tìm thấy một sử dụng cho chức năng REVERSE.

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

6
Lưu ý rằng mã này trả về NULLnếu vượt qua một chuỗi ngắn hơn phạm vi xóa được chỉ định cho STUFF. Gói nó trong một ISNULLđể có được một giá trị đầu ra khác nhau cho trường hợp chuỗi trống.
Rozwel

11
Thật tuyệt, sử dụng cái này với một ứng dụng bên ngoài, với đường dẫn xml ('') để loại bỏ dấu phẩy. khủng khiếp
Tracker1

Cũng giống như @ Tracker1. Không giống như bất cứ điều gì liên quan đến LEN (), hoạt động duyên dáng này (không lặp lại bất cứ điều gì) cho chuỗi trống (đặc biệt được gói trong ISNULL ())
gregmac

Nó thực sự đáng chú ý làm thế nào đôi khi SQL tàn bạo có thể. Điều này thật phi thường.
eouw0o83hf

Cảm ơn, nó đã giúp tôi, trong trường hợp của tôi, tôi đã có một khoảng trống cuối cùng nên chỉ số đầu tiên là 2select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Arngue 18/07/18

52

Thử cái này:

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

@Adrien bất kỳ ý tưởng tại sao điều này dường như cho kết quả tương tự như select substring('test string', 0, len('test string'))?
Louis Waweru

@Louis, cú pháp chuỗi con như sau : SUBSTRING ( expression ,start , length ). Bây giờ, cả hai truy vấn đều trả về giống nhau vì việc đánh số là 1 dựa trên, có nghĩa là ký tự đầu tiên trong biểu thức là 1. Nếu bắt đầu nhỏ hơn 1, biểu thức được trả về sẽ bắt đầu ở ký tự đầu tiên được chỉ định trong biểu thức. Nguồn
JS5

26

Nếu chuỗi của bạn trống,

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

sau đó mã này sẽ gây ra thông báo lỗi 'Tham số độ dài không hợp lệ được truyền cho hàm chuỗi con.'

Bạn có thể xử lý nó theo cách này:

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

Nó sẽ luôn trả về kết quả và NULL trong trường hợp chuỗi rỗng.



9

Điều này sẽ hoạt động ngay cả khi văn bản nguồn / var là null hoặc trống:

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

2
Đây là một nhận xét Không thể bỏ qua, nó nhanh và không phải chọn chuỗi hai lần để hoạt động.
Randall

7

Nếu coloumn của bạn là textvà không varchar, thì bạn có thể sử dụng điều này:

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

5

Nếu bạn muốn thực hiện việc này theo hai bước, thay vì ba bước REVERSE-STUFF-REVERSE, bạn có thể có dấu tách danh sách của mình là một hoặc hai khoảng trắng. Sau đó, sử dụng RTRIM để cắt các khoảng trắng ở cuối và REPLACE để thay thế các khoảng trắng kép bằng ','

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

Tuy nhiên, đây không phải là một ý tưởng tốt nếu chuỗi ban đầu của bạn có thể chứa các không gian bên trong.

Không chắc chắn về hiệu suất. Mỗi REVERSE tạo ra một bản sao mới của chuỗi, nhưng STUFF nhanh hơn một phần ba so với REPLACE.

cũng thấy này




2

bạn có thể tạo chức năng

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

Thử cái này

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

2

Lấy nhân vật cuối cùng

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

Tuy nhiên, tôi không nghĩ rằng đây là những gì anh ấy đã hỏi - tuy nhiên điều này có thể hữu ích để đưa ra nhận xét.
13

3
chỉ đúng (@ chuỗi, 1).
GoalBasing

1

Câu trả lời của tôi tương tự như câu trả lời được chấp nhận, nhưng nó cũng kiểm tra Null và chuỗi rỗng.

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

Điều này là khá muộn, nhưng thú vị chưa bao giờ được đề cập.

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

I E:

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

0

Tôi yêu câu trả lời của @ bill-hoenig; tuy nhiên, tôi đang sử dụng truy vấn con và tôi đã bị bắt vì hàm REVERSE cần hai bộ dấu ngoặc. Mất một lúc để tìm ra cái đó!

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

Bạn có thể muốn sử dụng một ứng dụng bên ngoài / chéo cho phần tổng hợp của truy vấn. Tôi đang sử dụng điều này để có được một bộ cờ cho một mục cha mẹ.
Tracker1

0

Để cập nhật bản ghi bằng cách cắt bớt N ký tự cuối cùng của một cột cụ thể:

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

0

Thử nó :

  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

đầu ra:

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

0

Thử cái này,

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

Và đầu ra sẽ như thế nào, 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.