Tìm chỉ mục xuất hiện lần cuối của chuỗi con bằng T-SQL


127

Có cách nào đơn giản để tìm chỉ mục về lần xuất hiện cuối cùng của chuỗi bằng SQL không? Tôi đang sử dụng SQL Server 2000 ngay bây giờ. Về cơ bản tôi cần các chức năng mà System.String.LastIndexOfphương thức .NET cung cấp. Một chút googling đã tiết lộ điều này - Chức năng lấy chỉ mục cuối cùng - nhưng điều đó không hoạt động nếu bạn chuyển qua biểu thức cột "văn bản". Các giải pháp khác được tìm thấy ở nơi khác chỉ hoạt động miễn là văn bản bạn đang tìm kiếm dài 1 ký tự.

Tôi có thể sẽ phải nấu một chức năng lên. Nếu tôi làm như vậy, tôi sẽ đăng nó ở đây để mọi người có thể nhìn vào nó và có thể sử dụng.

Câu trả lời:


33

Bạn bị giới hạn trong danh sách nhỏ các chức năng cho kiểu dữ liệu văn bản.

Tất cả những gì tôi có thể đề xuất là bắt đầu với PATINDEX, nhưng làm việc ngược lại từDATALENGTH-1, DATALENGTH-2, DATALENGTH-3 vv cho đến khi bạn nhận được kết quả hoặc kết thúc ở mức 0 (DATALENGTH-DATALENGTH)

Đây thực sự là một cái gì đó SQL Server 2000 đơn giản là không thể xử lý.

Chỉnh sửa cho các câu trả lời khác : REVERSE không có trong danh sách các hàm có thể được sử dụng với dữ liệu văn bản trong SQL Server 2000


1
Vâng, nó khá khó xử. Điều này có vẻ như nó phải đơn giản, chỉ là nó không phải!
Raj

... đây là lý do tại sao SQL 2005 có varchar (tối đa) để cho phép các chức năng bình thường
gbn

1
Ah! vì vậy "varchar (max)" là một điều SQL 2005, điều này giải thích tại sao nó không hoạt động khi tôi thử nó trên SQL 2000.
Raj

DATALENGTH không tạo ra kết quả chính xác cho tôi, mặc dù LENGTH hoạt động.
Tequila

@Tequila và những người khác: DATALENGTHtrả về số byte không phải là ký tự. Do đó, DATALENGTHtrả về 2 x số lượng ký tự trong một chuỗi cho NVARCHARchuỗi. LENtuy nhiên, trả về số lượng ký tự, trừ mọi khoảng trắng ở cuối . Tôi không bao giờ sử dụng DATALENGTHđể tính toán độ dài ký tự trừ khi khoảng trắng theo dõi là đáng kể và tôi biết chắc chắn rằng các kiểu dữ liệu của tôi là nhất quán, cho dù chúng có VARCHARhoặcNVARCHAR
rbsdca 23/03/18

174

Cách đơn giản? Không, nhưng tôi đã sử dụng ngược lại. Nghĩa đen

Trong các thói quen trước, để tìm sự xuất hiện cuối cùng của một chuỗi đã cho, tôi đã sử dụng hàm REVERSE (), theo sau CHARINDEX, tiếp theo là REVERSE để khôi phục lại thứ tự ban đầu. Ví dụ:

SELECT
   mf.name
  ,mf.physical_name
  ,reverse(left(reverse(physical_name), charindex('\', reverse(physical_name)) -1))
 from sys.master_files mf

chỉ ra cách trích xuất tên tệp cơ sở dữ liệu thực tế từ "tên vật lý" của chúng, bất kể được lồng sâu đến mức nào trong các thư mục con. Điều này không chỉ tìm kiếm một ký tự (dấu gạch chéo ngược), nhưng bạn có thể xây dựng dựa trên ký tự này để có chuỗi tìm kiếm dài hơn.

Nhược điểm duy nhất là, tôi không biết điều này sẽ hoạt động tốt như thế nào trên các kiểu dữ liệu TEXT. Tôi đã sử dụng SQL 2005 được vài năm rồi và không còn làm việc với văn bản - nhưng tôi dường như nhớ lại rằng bạn có thể sử dụng TRÁI và PHẢI cho nó không?

Philip


1
Xin lỗi - Tôi khá chắc chắn rằng tôi chưa bao giờ quay lại khi tôi làm việc với 2000 và hiện tại tôi không có quyền truy cập vào bất kỳ cài đặt SQL 2000 nào.
Philip Kelley

Xuất sắc! Không bao giờ có thể nghĩ để tấn công vấn đề này theo cách này!
Jared

4
Đẹp quá Tôi sửa đổi cho nhu cầu của riêng tôi: email.Substring (0, email.lastIndexOf ( '@')) == CHỌN LEFT (email, LEN (email) -CHARINDEX ( '@', REVERSE (email)))
Fredrik Johansson

1
Thông minh như thế này là lý do tại sao lập trình rất thú vị!
Chris

tại sao không chỉ sử dụng bên phải thay vì bên trái trên bản gốc thay vì ngược lại
Phil

108

Cách đơn giản nhất là ....

REVERSE(SUBSTRING(REVERSE([field]),0,CHARINDEX('[expr]',REVERSE([field]))))

3
+1 Vì KHÔNG bắn lỗi như 'Tham số độ dài không hợp lệ được truyền cho hàm LEFT hoặc SUBSTRING' nếu không tìm thấy kết quả khớp
Xilmiki

12
Nếu bạn [expr]dài hơn 1 ký hiệu, bạn cũng cần đảo ngược nó!
Andrius Naruševičius

60

Nếu bạn đang sử dụng Sqlserver 2005 trở lên, sử dụng REVERSEchức năng nhiều lần sẽ gây bất lợi cho hiệu suất, mã bên dưới sẽ hiệu quả hơn.

DECLARE @FilePath VARCHAR(50) = 'My\Super\Long\String\With\Long\Words'
DECLARE @FindChar VARCHAR(1) = '\'

-- Shows text before last slash
SELECT LEFT(@FilePath, LEN(@FilePath) - CHARINDEX(@FindChar,REVERSE(@FilePath))) AS Before
-- Shows text after last slash
SELECT RIGHT(@FilePath, CHARINDEX(@FindChar,REVERSE(@FilePath))-1) AS After
-- Shows the position of the last slash
SELECT LEN(@FilePath) - CHARINDEX(@FindChar,REVERSE(@FilePath)) AS LastOccuredAt

1
Nó có vẻ rõ ràng trong nhận thức muộn màng, nhưng nếu bạn đang tìm kiếm một chuỗi thay vì một nhân vật duy nhất, bạn phải làm: LEN (@FilePath) - CHARINDEX (REVERSE (@FindString), REVERSE (@FilePath))
pkExec

14
DECLARE @FilePath VARCHAR(50) = 'My\Super\Long\String\With\Long\Words'
DECLARE @FindChar VARCHAR(1) = '\'

SELECT LEN(@FilePath) - CHARINDEX(@FindChar,REVERSE(@FilePath)) AS LastOccuredAt

8

Câu hỏi cũ nhưng vẫn còn hiệu lực, vì vậy đây là những gì tôi đã tạo dựa trên thông tin được cung cấp bởi những người khác ở đây.

create function fnLastIndexOf(@text varChar(max),@char varchar(1))
returns int
as
begin
return len(@text) - charindex(@char, reverse(@text)) -1
end

7

Điều này làm việc rất tốt cho tôi.

REVERSE(SUBSTRING(REVERSE([field]), CHARINDEX(REVERSE('[expr]'), REVERSE([field])) + DATALENGTH('[expr]'), DATALENGTH([field])))

6
REVERSE(SUBSTRING(REVERSE(ap_description),CHARINDEX('.',REVERSE(ap_description)),len(ap_description)))  

làm việc tốt hơn cho tôi


4

Hmm, tôi biết đây là một luồng cũ, nhưng một bảng kiểm đếm có thể làm điều này trong SQL2000 (hoặc bất kỳ cơ sở dữ liệu nào khác):

DECLARE @str CHAR(21),
        @delim CHAR(1)
 SELECT @str = 'Your-delimited-string',
        @delim = '-'

SELECT
    MAX(n) As 'position'
FROM
    dbo._Tally
WHERE
    substring(@str, _Tally.n, 1) = @delim

Một bảng kiểm đếm chỉ là một bảng các số tăng dần.

Các substring(@str, _Tally.n, 1) = @delim nhận được của mỗi dấu phân cách, sau đó bạn chỉ cần có được vị trí tối đa trong tập hợp đó.

Bảng kiểm đếm là tuyệt vời. Nếu bạn chưa từng sử dụng chúng trước đây, thì có một bài viết hay về SQL Server Central (Free reg hoặc chỉ sử dụng Bug Me Not ( http://www.ormsmenot.com/view/sqlservercentral.com )).

* EDIT: Đã xóa n <= LEN(TEXT_FIELD), vì bạn không thể sử dụng LEN () trên loại văn bản. Miễn là substring(...) = @delimvẫn còn mặc dù kết quả vẫn đúng.


Đẹp. Tôi nghĩ rằng đây thực sự là một giải pháp tương tự như câu trả lời được chấp nhận bởi gbn; bạn chỉ đang sử dụng bảng để lưu trữ các số nguyên 1, 2, 3, v.v. được trừ khỏi ĐỐI TƯỢNG và đọc từ ký tự đầu tiên về phía trước thay vì ký tự cuối cùng trở lại.
Michael Petito

2

Đảo ngược cả chuỗi của bạn và chuỗi con của bạn, sau đó tìm kiếm lần xuất hiện đầu tiên.


Điểm tốt. Bây giờ tôi không có 2000 và tôi không thể nhớ lại nếu tôi có thể làm điều đó khi tôi làm.
AK

2

Một số câu trả lời khác trả về một chuỗi thực tế trong khi tôi cần biết thêm chỉ số thực tế int. Và những câu trả lời làm điều đó dường như quá phức tạp. Sử dụng một số câu trả lời khác làm cảm hứng, tôi đã làm như sau ...

Đầu tiên, tôi tạo một hàm:

CREATE FUNCTION [dbo].[LastIndexOf] (@stringToFind varchar(max), @stringToSearch varchar(max))
RETURNS INT
AS
BEGIN
    RETURN (LEN(@stringToSearch) - CHARINDEX(@stringToFind,REVERSE(@stringToSearch))) + 1
END
GO

Sau đó, trong truy vấn của bạn, bạn có thể chỉ cần làm điều này:

declare @stringToSearch varchar(max) = 'SomeText: SomeMoreText: SomeLastText'

select dbo.LastIndexOf(':', @stringToSearch)

Ở trên sẽ trả về 23 (chỉ mục cuối cùng của ':')

Hy vọng điều này làm cho nó dễ dàng hơn một chút cho một ai đó!


2

Tôi nhận ra đây là một câu hỏi cũ, nhưng ...

Trên Access 2010, bạn có thể sử dụng InStrRev()để làm điều này. Hi vọng điêu nay co ich.


2

Câu trả lời này sử dụng MS SQL Server 2008 (Tôi không có quyền truy cập vào MS SQL Server 2000), nhưng cách tôi nhìn thấy nó theo OP là 3 tình huống cần xem xét. Từ những gì tôi đã cố gắng không có câu trả lời ở đây bao gồm cả 3 trong số họ:

  1. Trả về chỉ mục cuối cùng của một ký tự tìm kiếm trong một chuỗi đã cho.
  2. Trả về chỉ mục cuối cùng của chuỗi phụ tìm kiếm (không chỉ là một ký tự đơn) trong một chuỗi đã cho.
  3. Nếu ký tự tìm kiếm hoặc chuỗi con không nằm trong chuỗi trả về đã cho 0

Hàm tôi đưa ra có 2 tham số:

@String NVARCHAR(MAX) : Chuỗi cần tìm kiếm

@FindString NVARCHAR(MAX) : Hoặc là một ký tự đơn hoặc một chuỗi con để lấy chỉ mục cuối cùng trong @String

Nó trả về một INTđó là một trong hai chỉ số tích cực của @FindStringtrong @Stringhoặc 0có nghĩa là@FindString không có trong@String

Đây là một lời giải thích về những gì chức năng làm:

  1. Khởi tạo @ReturnValđể 0chỉ ra rằng @FindStringkhông có trong@String
  2. Kiểm tra các chỉ số của @FindStringtrong @Stringbằng cách sử dụngCHARINDEX()
  3. Nếu các chỉ số @FindStringtrong @Stringđược 0, @ReturnVallà trái như0
  4. Nếu các chỉ số @FindStringtrong @String> 0, @FindStringlà trong @Stringnên nó sẽ tính toán chỉ số cuối cùng của @FindStringnăm @Stringbằng cách sử dụngREVERSE()
  5. Trả về @ReturnValmột số dương là chỉ số cuối cùng @FindStringtrong @Stringhoặc 0chỉ ra rằng @FindStringkhông có trong@String

Đây là tập lệnh tạo chức năng (sao chép và dán sẵn sàng):

CREATE FUNCTION [dbo].[fn_LastIndexOf] 
(@String NVARCHAR(MAX)
, @FindString NVARCHAR(MAX))
RETURNS INT
AS 
BEGIN
    DECLARE @ReturnVal INT = 0
    IF CHARINDEX(@FindString,@String) > 0
        SET @ReturnVal = (SELECT LEN(@String) - 
        (CHARINDEX(REVERSE(@FindString),REVERSE(@String)) + 
        LEN(@FindString)) + 2)  
    RETURN @ReturnVal
END

Dưới đây là một chút thuận tiện kiểm tra chức năng:

DECLARE @TestString NVARCHAR(MAX) = 'My_sub2_Super_sub_Long_sub1_String_sub_With_sub_Long_sub_Words_sub2_'
, @TestFindString NVARCHAR(MAX) = 'sub'

SELECT dbo.fn_LastIndexOf(@TestString,@TestFindString)

Tôi chỉ chạy cái này trên MS SQL Server 2008 vì tôi không có quyền truy cập vào bất kỳ phiên bản nào khác, nhưng từ những gì tôi đã xem xét thì điều này sẽ tốt cho năm 2008+.

Thưởng thức.


1

Tôi biết rằng nó sẽ không hiệu quả nhưng bạn đã xem xét việc chuyển texttrường sang varcharđể bạn có thể sử dụng giải pháp được cung cấp bởi trang web bạn tìm thấy chưa? Tôi biết rằng giải pháp này sẽ tạo ra các vấn đề vì bạn có khả năng cắt ngắn bản ghi nếu độ dài trong texttrường vượt quá độ dài của bạn varchar(chưa kể nó sẽ không hiệu quả lắm).

Vì dữ liệu của bạn nằm trong một texttrường (và bạn đang sử dụng SQL Server 2000), các tùy chọn của bạn bị giới hạn.


Có, truyền tới "varchar" không phải là một tùy chọn vì dữ liệu được xử lý thường xuyên vượt quá mức tối đa có thể được giữ trong một "varchar". Cảm ơn câu trả lời của bạn mặc dù!
Raj

1

Nếu bạn muốn lấy chỉ mục của khoảng trắng cuối cùng trong một chuỗi từ, bạn có thể sử dụng biểu thức này ĐÚNG (tên, (CHARINDEX ('', REVERSE (tên), 0)) để trả về từ cuối cùng trong chuỗi. sẽ hữu ích nếu bạn muốn phân tích tên cuối cùng của tên đầy đủ bao gồm tên viết tắt của tên đầu tiên và / hoặc tên đệm.


1

@indexOf = <whatever characters you are searching for in your string>

@LastIndexOf = LEN([MyField]) - CHARINDEX(@indexOf, REVERSE([MyField]))

Chưa được kiểm tra, nó có thể bị tắt bởi vì chỉ số bằng 0, nhưng hoạt động trong SUBSTRINGchức năng khi cắt từ các @indexOfký tự đến cuối chuỗi của bạn

SUBSTRING([MyField], 0, @LastIndexOf)


1

Mã này hoạt động ngay cả khi chuỗi con chứa nhiều hơn 1 ký tự.

DECLARE @FilePath VARCHAR(100) = 'My_sub_Super_sub_Long_sub_String_sub_With_sub_Long_sub_Words'
DECLARE @FindSubstring VARCHAR(5) = '_sub_'

-- Shows text before last substing
SELECT LEFT(@FilePath, LEN(@FilePath) - CHARINDEX(REVERSE(@FindSubstring), REVERSE(@FilePath)) - LEN(@FindSubstring) + 1) AS Before
-- Shows text after last substing
SELECT RIGHT(@FilePath, CHARINDEX(REVERSE(@FindSubstring), REVERSE(@FilePath)) -1) AS After
-- Shows the position of the last substing
SELECT LEN(@FilePath) - CHARINDEX(REVERSE(@FindSubstring), REVERSE(@FilePath)) AS LastOccuredAt

0

Tôi cần tìm vị trí cuối cùng thứ n của dấu gạch chéo ngược trong đường dẫn thư mục. Đây là giải pháp của tôi.

/*
http://stackoverflow.com/questions/1024978/find-index-of-last-occurrence-of-a-sub-string-using-t-sql/30904809#30904809
DROP FUNCTION dbo.GetLastIndexOf
*/
CREATE FUNCTION dbo.GetLastIndexOf
(
  @expressionToFind         VARCHAR(MAX)
  ,@expressionToSearch      VARCHAR(8000)
  ,@Occurrence              INT =  1        -- Find the nth last 
)
RETURNS INT
AS
BEGIN

    SELECT  @expressionToSearch = REVERSE(@expressionToSearch)

    DECLARE @LastIndexOf        INT = 0
            ,@IndexOfPartial    INT = -1
            ,@OriginalLength    INT = LEN(@expressionToSearch)
            ,@Iteration         INT = 0

    WHILE (1 = 1)   -- Poor man's do-while
    BEGIN
        SELECT @IndexOfPartial  = CHARINDEX(@expressionToFind, @expressionToSearch)

        IF (@IndexOfPartial = 0) 
        BEGIN
            IF (@Iteration = 0) -- Need to compensate for dropping out early
            BEGIN
                SELECT @LastIndexOf = @OriginalLength  + 1
            END
            BREAK;
        END

        IF (@Occurrence > 0)
        BEGIN
            SELECT @expressionToSearch = SUBSTRING(@expressionToSearch, @IndexOfPartial + 1, LEN(@expressionToSearch) - @IndexOfPartial - 1)
        END

        SELECT  @LastIndexOf = @LastIndexOf + @IndexOfPartial
                ,@Occurrence = @Occurrence - 1
                ,@Iteration = @Iteration + 1

        IF (@Occurrence = 0) BREAK;
    END

    SELECT @LastIndexOf = @OriginalLength - @LastIndexOf + 1 -- Invert due to reverse
    RETURN @LastIndexOf 
END
GO

GRANT EXECUTE ON GetLastIndexOf TO public
GO

Dưới đây là các trường hợp thử nghiệm của tôi vượt qua

SELECT dbo.GetLastIndexOf('f','123456789\123456789\', 1) as indexOf -- expect 0 (no instances)
SELECT dbo.GetLastIndexOf('\','123456789\123456789\', 1) as indexOf -- expect 20
SELECT dbo.GetLastIndexOf('\','123456789\123456789\', 2) as indexOf -- expect 10
SELECT dbo.GetLastIndexOf('\','1234\6789\123456789\', 3) as indexOf -- expect 5

0

Để lấy phần trước lần xuất hiện cuối cùng của dấu phân cách (chỉ hoạt động NVARCHARdo DATALENGTHsử dụng):

DECLARE @Fullstring NVARCHAR(30) = '12.345.67890.ABC';

DECLARE @Delimiter CHAR(1) = '.';

SELECT SUBSTRING(@Fullstring, 1, DATALENGTH(@Fullstring)/2 - CHARINDEX(@Delimiter, REVERSE(@Fullstring)));

0

Câu trả lời này đáp ứng các yêu cầu của OP. cụ thể, nó cho phép kim nhiều hơn một ký tự và nó không phát sinh lỗi khi không tìm thấy kim trong haystack. Dường như với tôi rằng hầu hết (tất cả?) Các câu trả lời khác không xử lý các trường hợp cạnh đó. Ngoài ra, tôi đã thêm đối số "Vị trí bắt đầu" được cung cấp bởi hàm CharIndex của máy chủ MS SQL gốc. Tôi đã cố gắng phản ánh chính xác đặc điểm kỹ thuật cho Char Index ngoại trừ xử lý từ phải sang trái thay vì từ trái sang phải. ví dụ: tôi trả về null nếu kim hoặc haystack là null và tôi trả về 0 nếu không tìm thấy kim trong haystack. Một điều mà tôi không thể có được là với chức năng tích hợp, tham số thứ ba là tùy chọn. Với các hàm do người dùng SQL Server xác định, tất cả các tham số phải được cung cấp trong cuộc gọi trừ khi hàm được gọi bằng "EXEC" . Mặc dù tham số thứ ba phải được đưa vào danh sách tham số, bạn có thể cung cấp từ khóa "mặc định" làm trình giữ chỗ cho nó mà không phải cung cấp cho nó một giá trị (xem ví dụ bên dưới). Vì việc loại bỏ tham số thứ ba khỏi hàm này sẽ dễ dàng hơn nếu không mong muốn hơn là thêm nó nếu cần, tôi đã đưa nó vào đây làm điểm bắt đầu.

create function dbo.lastCharIndex(
 @needle as varchar(max),
 @haystack as varchar(max),
 @offset as bigint=1
) returns bigint as begin
 declare @position as bigint
 if @needle is null or @haystack is null return null
 set @position=charindex(reverse(@needle),reverse(@haystack),@offset)
 if @position=0 return 0
 return (len(@haystack)-(@position+len(@needle)-1))+1
end
go

select dbo.lastCharIndex('xyz','SQL SERVER 2000 USES ANSI SQL',default) -- returns 0
select dbo.lastCharIndex('SQL','SQL SERVER 2000 USES ANSI SQL',default) -- returns 27
select dbo.lastCharIndex('SQL','SQL SERVER 2000 USES ANSI SQL',1) -- returns 27
select dbo.lastCharIndex('SQL','SQL SERVER 2000 USES ANSI SQL',11) -- returns 1

0

Tôi đã xem qua chủ đề này trong khi tìm kiếm một giải pháp cho vấn đề tương tự của tôi có cùng yêu cầu chính xác nhưng đối với một loại cơ sở dữ liệu khác cũng thiếu REVERSE chức năng.

Trong trường hợp của tôi, đây là cơ sở dữ liệu OpenEdge (Progress) , có cú pháp hơi khác. Điều này làm cho INSTRchức năng có sẵn cho tôi mà hầu hết các cơ sở dữ liệu gõ của Oracle cung cấp .

Vì vậy, tôi đã đưa ra mã sau đây:

SELECT 
  INSTR(foo.filepath, '/',1, LENGTH(foo.filepath) - LENGTH( REPLACE( foo.filepath, '/',  ''))) AS IndexOfLastSlash 
FROM foo

Tuy nhiên, đối với tình huống cụ thể của tôi (là cơ sở dữ liệu OpenEdge (Tiến trình) ), điều này không dẫn đến hành vi mong muốn vì thay thế ký tự bằng một char trống có cùng độ dài với chuỗi gốc. Điều này không có ý nghĩa nhiều với tôi nhưng tôi đã có thể bỏ qua vấn đề với mã dưới đây:

SELECT 
  INSTR(foo.filepath, '/',1, LENGTH( REPLACE( foo.filepath, '/',  'XX')) - LENGTH(foo.filepath))  AS IndexOfLastSlash 
FROM foo

Bây giờ tôi hiểu rằng mã này sẽ không giải quyết được vấn đề cho T-SQL vì không có sự thay thế nào cho INSTRchức năng cung cấpOccurence tính.

Để được kỹ lưỡng, tôi sẽ thêm mã cần thiết để tạo hàm vô hướng này để nó có thể được sử dụng giống như tôi đã làm trong các ví dụ trên.

  -- Drop the function if it already exists
  IF OBJECT_ID('INSTR', 'FN') IS NOT NULL
    DROP FUNCTION INSTR
  GO

  -- User-defined function to implement Oracle INSTR in SQL Server
  CREATE FUNCTION INSTR (@str VARCHAR(8000), @substr VARCHAR(255), @start INT, @occurrence INT)
  RETURNS INT
  AS
  BEGIN
    DECLARE @found INT = @occurrence,
            @pos INT = @start;

    WHILE 1=1 
    BEGIN
        -- Find the next occurrence
        SET @pos = CHARINDEX(@substr, @str, @pos);

        -- Nothing found
        IF @pos IS NULL OR @pos = 0
            RETURN @pos;

        -- The required occurrence found
        IF @found = 1
            BREAK;

        -- Prepare to find another one occurrence
        SET @found = @found - 1;
        SET @pos = @pos + 1;
    END

    RETURN @pos;
  END
  GO

Để tránh điều hiển nhiên, khi REVERSEhàm có sẵn, bạn không cần tạo hàm vô hướng này và bạn chỉ có thể nhận được kết quả cần thiết như thế này:

SELECT
  LEN(foo.filepath) - CHARINDEX('/', REVERSE(foo.filepath))+1 AS LastIndexOfSlash 
FROM foo
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.