2009-08-10 35 views

Trả lời

161

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 
+46

Hoặc: CHỌN LEFT (YourColumnName, LEN (YourColumnName) - 1) TỪ YourTable –

+6

Lưu ý, điều này ném một lỗi nếu chuỗi của bạn là trống rỗng. – gregmac

+2

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

35

Hãy thử điều này:

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

@Adrien bất kỳ ý tưởng tại sao điều này dường như cho kết quả tương tự như 'chọn chuỗi con ('chuỗi kiểm tra', 0, len ('chuỗi kiểm tra'))'? – Louis

85

Nếu vì một số lý do lý cột của bạn là phức tạp (trường hợp khi ... sau đó ... else ... end), sau đó các giải pháp trên làm cho bạn phải lặp lại cùng một logic trong hàm len(). Nhân đôi 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 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 hàm REVERSE.

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

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

+11

Tốt đẹp, sử dụng tính năng này với lớp ngoài được áp dụng, với đường dẫn xml ('') để loại bỏ dấu phẩy sau. awseome – Tracker1

+0

Cũng giống như cách @ Tracker1. Không giống như bất kỳ thứ gì liên quan đến LEN(), nó làm việc một cách duyên dáng (không lặp lại bất kỳ thứ gì) cho chuỗi rỗng (đặc biệt là trong ISNULL()) – gregmac

19

Nếu chuỗi của bạn là trống rỗ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ố chiều dài không hợp lệ truyền cho hàm substring.'

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

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

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

5

Nếu coloumn của bạn là text và không varchar, sau đó bạn có thể sử dụng này:

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

Tôi yêu @ câu trả lời hóa đơn Hoenig 's; tuy nhiên, tôi đã sử dụng truy vấn con và tôi bị bắt vì hàm REVERSE cần hai bộ ngoặc đơn. Đã cho tôi một thời gian để tìm ra điều đó!

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 
+0

Bạn có thể muốn sử dụng một/chéo chéo áp dụng 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. – Tracker1

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 bạn là một hoặc hai dấu cách. Sau đó sử dụng RTRIM để cắt dấu không gian, và REPLACE để thay thế khoảng trống đôi với ''

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 khoảng trắng bên trong.

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

cũng thấy this

1

Lấy ký tự cuối cùng Phải (@string, len (@String) - (len (@String) - 1))

+0

Tôi không nghĩ rằng đây là những gì ông đã yêu cầu, mặc dù - điều này có thể hữu ích để đưa vào một bình luận, tuy nhiên. – jimwise

+3

vừa phải (@string, 1). – GoalBased

-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+','[email protected] 
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) 
+0

Tôi nghĩ rằng các câu trả lời hiện có đã bao gồm phương pháp này. – Sam

1

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 
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 Chuỗi rỗng và trố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 
0

Để cập nhật các bản ghi bằng cách cắt tỉa 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

Try It:

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 
4
select left('TEST STRING', len('TEST STRING')-1) 
1

Hãy thử điều này

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

Hãy thử điều này,

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

Và kết quả sẽ như thế nào, THAMIZHMANI

1
@result = substring(@result, 1, (LEN(@result)-1)) 
2

Tôi có thể đề nghị -hack- này;).

select 
    left(txt, abs(len(txt + ',') - 2)) 
from 
    t; 

SQL Server Fiddle Demo

Các vấn đề liên quan