我需要获取在多个相同符号中最后一次出现的符号。
SELECT Charindex('|', 'abc||xyz')
这将得到4,但是我需要获取最后一个'|'的索引,即索引5。然后根据该索引对字符串进行子字符串化。
编辑: 对不起,我之前的问题不对。我忘了提到字符串可能包含更多数量的字符和符号。
如果字符串'abc || xyz',则@forpas答案正确。
但是如果字符串是'abc || xyz ||| qwe',这将变成错误
编辑2: 基本上,我想在循环字符串时对包括定界符的字符串进行字符串化。
Declare
@txt as nvarcar(max),
@newTxt as nvarchar(50)
SET @txt = 'dog|cat|||fish|horse||||frog'
--while looping
--1st loop:
@newTxt = 'dog|'
@txt = 'cat|||fish|horse||||frog'
--2nd loop:
@newTxt = 'cat|||'
@txt = 'fish|horse||||frog'
--3rd loop:
@newTxt = 'fish|'
@txt = 'horse||||frog'
...
更新 最初的问题是关于在给定字符串中查找索引。但是由于缺少信息而进行了多次更新,因此其他答案与新问题冲突。在第二版之后,整个过程突然被我接受的答案所完成。因此,为了使该主题有用,将更新问题的标题和某些上下文。
答案 0 :(得分:3)
这回答了原始问题:
我需要获取多个相同符号中最后一次出现的符号 符号。
对颠倒的字符串使用charindex()
,并从字符串的长度中减去它:
select len('abc||xyz') - charindex('|', reverse('abc||xyz')) + 1
对于“ |”字符串中不存在,如果要返回0,请使用以下命令:
select (len('abc||xyz') - charindex('|', reverse('abc||xyz')) + 1) % (len('abc||xyz') + 1)
请参见demo。
答案 1 :(得分:1)
您可以使用此SplitString函数获取具有找到位置的索引的值列表,并使其适应您的目的。...
CREATE FUNCTION [dbo].[fn_SplitString2]
(
@string NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @output TABLE(id int not null primary key identity, splitdata NVARCHAR(MAX), startindex int)
BEGIN
DECLARE @start INT, @end INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
WHILE @start < LEN(@string) + 1 BEGIN
IF @end = 0
SET @end = LEN(@string) + 1
INSERT INTO @output (splitdata, startindex)
VALUES(SUBSTRING(@string, @start, @end - @start), @start)
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
END
RETURN
END
DECLARE @st VARCHAR(100) = 'dog|cat|||fish|horse||||frog';
SELECT *
FROM [dbo].[fn_SplitString2](@st, '|') A
WHERE splitdata <> ''
输出:
id splitdata startindex
1条狗1
2猫5
5条鱼11
6马16
10只青蛙25
答案 2 :(得分:0)
这也将获得(4)
SELECT CHARINDEX('|', 'abc||xyz', 1) AS MatchPosition;
答案 3 :(得分:0)
尝试这个
SELECT INSTR('abc||xyz','|',1,REGEXP_COUNT('abc||xyz','|'))
"PipeSearch" FROM DUAL;