2015-06-24 13 views
13

Tôi đã chết lặng rằng câu hỏi này chưa được hỏi một cách có ý nghĩa. Làm thế nào để đi về việc tạo ra một hàm tương đương trong SQL như LTRIM hoặc RTRIM cho trả về vận chuyển và dòng cấp dữ liệu CHỈ ở đầu hoặc cuối của một chuỗi.SQL Chỉ xóa bỏ hàng trả về hàng đầu hoặc theo sau

Rõ ràng là REPLACE(REPLACE(@MyString,char(10),''),char(13),'') xóa TẤT CẢ lợi tức vận chuyển và nguồn cấp dữ liệu dòng mới. Đó không phải là những gì tôi đang tìm kiếm. Tôi chỉ muốn loại bỏ những hàng đầu hoặc cuối.

Trả lời

17

Tìm ký tự đầu tiên là khôngCHAR(13) hoặc CHAR(10) và trừ vị trí của nó khỏi độ dài của chuỗi.

LTRIM()

SELECT RIGHT(@MyString,LEN(@MyString)-PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%',@MyString)+1) 

RTRIM()

SELECT LEFT(@MyString,LEN(@MyString)-PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%',REVERSE(@MyString))+1) 
+0

Điều này là tốt, nhưng không thành công nếu chuỗi chỉ chứa các ký tự CRLF. PATINDEX trả về 0 trong trường hợp này, vì vậy toàn bộ chuỗi được trả về. – Dave

6

chức năng Sau đây là tăng cường các loại trim chức năng bạn có thể sử dụng. Sao chép từ sqlauthority.com

Những chức năng loại bỏ dấu không gian, không gian hàng đầu, khoảng trắng, tab, xuống dòng, dòng nguồn cấp dữ liệu, vv

Trim Left

CREATE FUNCTION dbo.LTrimX(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX) 
AS 
BEGIN 
DECLARE @trimchars VARCHAR(10) 
SET @trimchars = CHAR(9)+CHAR(10)+CHAR(13)+CHAR(32) 
IF @str LIKE '[' + @trimchars + ']%' SET @str = SUBSTRING(@str, PATINDEX('%[^' + @trimchars + ']%', @str), 8000) 
RETURN @str 
END 

Trim Ngay

CREATE FUNCTION dbo.RTrimX(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX) 
AS 
BEGIN 
DECLARE @trimchars VARCHAR(10) 
SET @trimchars = CHAR(9)+CHAR(10)+CHAR(13)+CHAR(32) 
IF @str LIKE '%[' + @trimchars + ']' 
SET @str = REVERSE(dbo.LTrimX(REVERSE(@str))) 
RETURN @str 
END 

Trim cả trái và phải

CREATE FUNCTION dbo.TrimX(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX) 
AS 
BEGIN 
RETURN dbo.LTrimX(dbo.RTrimX(@str)) 
END 

Sử dụng chức năng

SELECT dbo.TRIMX(@MyString) 
2

Dưới đây là một ví dụ bạn có thể chạy:

tôi quyết định đúc kết quả như một giá trị Xml, vì vậy khi bạn click vào nó, bạn sẽ có thể xem Carriage Returns.

DECLARE @CRLF Char(2) = (CHAR(0x0D) + CHAR(0x0A)) 
DECLARE @String VarChar(MAX) = @CRLF + @CRLF + ' Hello' + @CRLF + 'World ' + @CRLF + @CRLF 
--Unmodified String: 
SELECT CAST(@String as Xml)[Unmodified] 
--Remove Trailing Whitespace (including Spaces). 
SELECT CAST(LEFT(@String, LEN(REPLACE(@String, @CRLF, ' '))) as Xml)[RemoveTrailingWhitespace] 
--Remove Leading Whitespace (including Spaces). 
SELECT CAST(RIGHT(@String, LEN(REVERSE(REPLACE(@String, @CRLF, ' ')))) as Xml)[RemoveLeadingWhitespace] 
--Remove Leading & Trailing Whitespace (including Spaces). 
SELECT CAST(SUBSTRING(@String, LEN(REPLACE(@String, ' ', '_')) - LEN(REVERSE(REPLACE(@String, @CRLF, ' '))) + 1, LEN(LTRIM(RTRIM(REPLACE(@String, @CRLF, ' '))))) as Xml)[RemoveAllWhitespace] 
--Remove Only Leading and Trailing CR/LF's (while still preserving all other Whitespace - including Spaces). - 04/06/2016 - MCR. 
SELECT CAST(SUBSTRING(@String, PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%',@String), LEN(REPLACE(@String, ' ', '_')) - PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%',@String) + 1 - PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%', REVERSE(@String)) + 1) as Xml)[RemoveLeadingAndTrailingCRLFsOnly] 

Hãy nhớ loại bỏ Cast-to-Xml, vì điều này được thực hiện giống như một Proof-of-Concept để hiển thị nó hoạt động.

Làm cách nào tốt hơn câu trả lời được chấp nhận hiện tại?

Thoạt nhìn, điều này có thể xuất hiện để sử dụng nhiều Chức năng hơn Câu trả lời được chấp nhận.
Tuy nhiên, đây không phải là trường hợp.
Nếu bạn kết hợp cả hai phương pháp được liệt kê trong trả lời được chấp nhận (để loại bỏ cả Trailing và Khoảng trắng ở đầu), bạn sẽ có thể sở để thực hiện hai đường chuyền cập nhật Ghi, hoặc bản sao tất cả của một logic vào khác (ở khắp mọi nơi @String được liệt kê), điều này sẽ gây ra nhiều cuộc gọi chức năng hơn và trở nên khó đọc hơn.

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