获取第3个连字符(-)之后的所有字符

问题描述 投票:0回答:2

我有 TrackNo 列,其值如下

8070444981-010023-013123-INBBTC-C
601724-072923-078923-INAAAX-B

我需要从第三个连字符示例中获取值

-INBBTC-C
-INAAAX-B

我尝试了 substring,charindex 但它不适用于 这两种情况

select substring( Trackno,
charindex('-', TrackNo , (charindex('-', TrackNo , 1))
+charindex('-', TrackNo, (charindex('-', TrackNo , 1))+1)),20) 
from table
sql sql-server substring charindex
2个回答
0
投票

请尝试以下基于 XML 和 XQuery 的解决方案。

XPath 谓词

/root/r[position() ge 4]
正在为您的场景完成工作:

获取第3个连字符(-)之后的所有字符

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, Trackno VARCHAR(100));  
INSERT INTO @tbl (Trackno) VALUES 
('8070444981-010023-013123-INBBTC-C'),
('601724-072923-078923-INAAAX-B');
-- DDL and sample data population, end

DECLARE @separator CHAR(1) = '-';

SELECT t.* 
    , REPLACE(c.query('data(/root/r[position() ge 4])')
        .value('text()[1]', 'VARCHAR(100)'), SPACE(1), @separator) AS result
FROM @tbl AS t
    CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA[' + 
        REPLACE(Trackno, @separator, ']]></r><r><![CDATA[') + 
        ']]></r></root>' AS XML)) AS t1(c);

输出

身份证 曲目号 结果
1 8070444981-010023-013123-INBBTC-C INBBTC-C
2 601724-072923-078923-INAAAX-B INAAAX-B

0
投票

如果您有 SQL 2022,则可以将

string_split
与可选的序数参数一起使用,并抓取您想要的任何部分(在
-
上拆分之后)。

除此之外,您可以使用嵌套的

charindex
调用来暴力破解该片段,就像您所做的那样。您只需要确保正确偏移每个块,这样您就不会在错误的位置切片。

;带轨道

ingNumbers (TrackNo) as
(
    select '8070444981-010023-013123-INBBTC-C'
    union all select '601724-072923-078923-INAAAX-B'
), b as
(
    select
        TrackNo,
        FirstIndex = charindex('-', TrackNo),
        SecondIndex = charindex
            (
                '-', 
                TrackNo, 
                charindex
                (
                    '-', 
                    TrackNo
                ) + 1
            ),
        ThirdIndex = charindex
            (
                '-', 
                TrackNo, 
                charindex
                (
                    '-', 
                    TrackNo, 
                    charindex
                    (
                        '-', 
                        TrackNo
                    ) + 1
                ) + 1
            )
    from trackingNumbers
)
select *,
LastTwo = substring(TrackNo, ThirdIndex + 1, len(TrackNo))
from b

如果需要,您还可以通过替换字符串中的各种值来将其转换为 JSON 或 XML 数据的形式来实现此目的,但为了解决您最初尝试的方法,我将避免使用这些方法。

© www.soinside.com 2019 - 2024. All rights reserved.