Câu trả lời:
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
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, ''))
NULL
nế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.
select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Thử cái này:
select substring('test string', 1, (len('test string') - 1))
select substring('test string', 0, len('test string'))
?
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
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.
Đ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))
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
Tôi có thể đề nghị này -hack-;).
select
left(txt, abs(len(txt + ',') - 2))
from
t;
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
Thử cái này
DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
Lấy nhân vật cuối cùng
Right(@string, len(@String) - (len(@String) - 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
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
Để 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
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
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)