SQL-根据索引在变量和子字符串中找到分隔符的索引

时间:2019-06-17 07:29:36

标签: sql sql-server split

我需要获取在多个相同符号中最后一次出现的符号。

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'
...

更新 最初的问题是关于在给定字符串中查找索引。但是由于缺少信息而进行了多次更新,因此其他答案与新问题冲突。在第二版之后,整个过程突然被我接受的答案所完成。因此,为了使该主题有用,将更新问题的标题和某些上下文。

4 个答案:

答案 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;