Làm cách nào để chuyển LTRIM từ Oracle sang SQL Server?


7

Chuyển một ứng dụng từ Oracle sang SQL Server, tôi có Oracle PL / SQL giả này:

SELECT LTRIM(MyColumn, '-, ') FROM MyTable

Tức là tôi đang sử dụng OracleLTRIM với đối số thứ hai, chỉ định các ký tự cắt từ phía bên trái của chuỗi.

Thật không may, phiên bản T-SQLLTRIM không cho phép tôi chỉ định các ký tự cần cắt.

Hiện tại, tôi không biết làm thế nào để di chuyển nó LTRIM. Tôi thậm chí đang suy nghĩ về việc xử lý kết quả trong ứng dụng lưu trữ C # của mình, sau khi tôi đọc MyColumn.

Điều này có vẻ không phù hợp với tôi.

Câu hỏi của tôi:

Có cách nào có ý nghĩa để có được LTRIMchức năng giống như cho T-SQL để vượt qua các ký tự để cắt đi không?

Chỉnh sửa 1:

Tôi cần phải thay thế -, ,từ đầu chuỗi.

Ví dụ:

   -----, ,,, This is ,- a test,---,

sẽ dẫn đến

This is ,- a test,---,

Chỉnh sửa 2:

Tôi hy vọng đây không phải là vấn đề XY .

Có thể viết lại toàn bộ truy vấn của tôi sẽ loại bỏ LTRIMhoàn toàn nhu cầu , mặc dù tôi muốn tập trung vào việc chuyển nó thành 1: 1 càng tốt và sau đó đặt câu hỏi về tính hữu ích của LTRIM.

Câu trả lời:


4

Lấy hậu tố của chuỗi bắt đầu từ ký tự đầu tiên không phải là dấu cách, dấu phẩy hoặc dấu gạch nối:

declare @str varchar(100) = '   -----, ,,, This is ,- a test,---,'

select  substring(@str,patindex('%[^ ,-]%',@str),len(@str))

Kết quả:

This is ,- a test,---,

Xin lưu ý rằng dấu gạch nối, vì đó là một ký tự đặc biệt trong các biểu thức chính quy có nghĩa là 'phạm vi' (ví dụ [a-z]), phải là dấu đầu tiên ( [^- ,]) hoặc cuối ( [^ ,-]).


1
Bạn không thể thoát khỏi dấu gạch ngang với \ để đặt nó ở bất cứ đâu?
majidarif

1
@majdarif - không, bạn không thể
David

6

Yeehaw.

DECLARE @MyTable TABLE ( MyColumn VARCHAR(100) );

INSERT @MyTable ( MyColumn )
    VALUES ( '-----, ,,, This is ,- a test,---,' );

SELECT *, 
        SUBSTRING(mt.MyColumn, ca.p, LEN(mt.MyColumn))
FROM @MyTable AS mt
CROSS APPLY ( SELECT * 
              FROM (VALUES (PATINDEX ('%[^ ,-]%', MyColumn))
            ) AS x (p) ) AS ca;

3

Tôi không nghĩ bạn sẽ hài lòng với giải pháp này so với Oracle ltrimnhưng nó làm những gì bạn muốn.

declare @Pattern varchar(32) = '-, ';

select case when MyColumn like '['+@Pattern+']%'
         then right(MyColumn
          , len(MyColumn)-(patindex('%[^'+@Pattern+']%',MyColumn)-1)
          )
       else MyColumn
       end
from MyTable

rextester: http://rextester.com/IXOL62563


3

Không thể nói nếu đây là giải pháp tốt nhất, nhưng điều này có thể được thực hiện với SUBSTRING, CHARINDEX, LEFT, LTRIM, và REPLACE. Tôi giả sử rằng bạn đang làm việc với 8000 ký tự trở xuống.

Mã kiểm tra:

DECLARE @test_string VARCHAR(100) = '   -----, ,,, This is ,- a test,---,';
SELECT SUBSTRING(@test_string, CHARINDEX(LEFT(LTRIM(REPLACE(REPLACE(@test_string + 'Z', ',', ''), '-', '')), 1), @test_string + 'Z'), 8000);

Đầu ra:

Đây là một bài kiểm tra,---,

Dưới đây là một lời giải thích của từng phần. Tôi đã thêm "Z" vào cuối để xử lý trường hợp trong đó chuỗi chỉ có các ký tự cần được loại bỏ. Đầu tiên xóa tất cả dấu phẩy:

REPLACE(@test_string + 'Z', ',', '')

Bỏ tất cả -:

REPLACE(REPLACE(@test_string + 'Z', ',', ''), '-', '')

Xóa các khoảng trống từ bên trái:

LTRIM(REPLACE(REPLACE(@test_string + 'Z', ',', ''), '-', ''))

Lấy ký tự đầu tiên không phải là dấu cách, dấu phẩy hoặc -:

LEFT(LTRIM(REPLACE(REPLACE(@test_string + 'Z', ',', ''), '-', '')), 1)

Tìm vị trí của ký tự đầu tiên không phải là dấu cách, dấu phẩy hoặc -:

CHARINDEX(LEFT(LTRIM(REPLACE(REPLACE(@test_string + 'Z', ',', ''), '-', '')), 1), @test_string + 'Z') 

Lấy chuỗi con bắt đầu tại vị trí mà chúng tôi tìm thấy:

SELECT SUBSTRING(@test_string, CHARINDEX(LEFT(LTRIM(REPLACE(REPLACE(@test_string + 'Z', ',', ''), '-', '')), 1), @test_string + 'Z'), 8000);

1
Điều này có hoạt động không nếu chuỗi không có ký tự nào khác ngoài dấu phẩy, dấu cách và dấu gạch ngang?
ypercubeᵀᴹ

1
@ ypercubeᵀᴹ Không, cảm ơn vì đã bắt được. Đã sửa mã để xử lý trường hợp đó.
Joe Obbish
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.