我有 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
请尝试以下基于 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 |
如果您有 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 数据的形式来实现此目的,但为了解决您最初尝试的方法,我将避免使用这些方法。