使用 T-SQL 查找子字符串最后一次出现的索引

160

有没有一种简单的方法使用SQL查找字符串的最后一次出现的索引?我目前正在使用SQL Server 2000。基本上,我需要 .NET System.String.LastIndexOf 方法提供的功能。通过一些谷歌搜索发现了这个链接 - 检索最后索引的函数 - 但是如果您传递 "text" 列表达式,它将无法工作。在其他地方找到的解决方案只在搜索的文本长度为1字符时有效。

我可能需要编写一个函数。如果我这样做,我会在这里发布它,以便您们可以查看并可能利用它。

23个回答

0

这个主题已经持续了一段时间。我将提供一个解决方案,涵盖不同的基础知识,并附上示例:

declare @aStringData varchar(100) = 'The quick brown/fox jumps/over the/lazy dog.pdf'
/*
The quick brown/fox jumps/over the/lazy dog.pdf
fdp.god yzal/eht revo/spmuj xof/nworb kciuq ehT
*/

select
    Len(@aStringData) - CharIndex('/', Reverse(@aStringData)) + 1 [Char Index],
    -- Get left side of character, without the character '/'
    Left(@aStringData, Len(@aStringData) - CharIndex('/', Reverse(@aStringData))) [Left excluding char],
    -- Get left side of character, including the character '/'
    Left(@aStringData, Len(@aStringData) - CharIndex('/', Reverse(@aStringData)) + 1) [Left including char],
    -- Get right side of character, without the character '/'
    Right(@aStringData, CharIndex('/', Reverse(@aStringData)) - 1) [Right including char]

要获取字符位置,需要将字符串反转,因为CharIndex获取第一个出现的字符。记住,当我们反转时,CharIndex光标会落在我们要查找的字符的另一侧。因此,如果想要获取字符串的左侧或右侧部分,则需要进行-1或+1的补偿。

0

要获取分隔符最后一次出现之前的部分(仅适用于 NVARCHAR,因为使用了 DATALENGTH):

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

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

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

0

处理查找长度>1的内容。如果需要,可以随意增加参数大小。

忍不住要发布一下

drop function if exists lastIndexOf
go 
create function lastIndexOf(@searchFor varchar(100),@searchIn varchar(500))
returns int
as
begin 

if LEN(@searchfor) > LEN(@searchin) return 0 
declare @r varchar(500), @rsp varchar(100)
select @r = REVERSE(@searchin)
select @rsp = REVERSE(@searchfor)
return len(@searchin) - charindex(@rsp, @r) - len(@searchfor)+1
end 

和测试

select dbo.lastIndexof('greg','greg greg asdflk; greg sadf' )  -- 18
select dbo.lastIndexof('greg','greg greg asdflk; grewg sadf' )  --5
select dbo.lastIndexof(' ','greg greg asdflk; grewg sadf' ) --24

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接