XPath predicate [position() ge (last()-1)]给出了最后两个标记。
SQL语言**
-- DDL and sample data population, start
DECLARE @tbl TABLE (tokens VARCHAR(256));
INSERT @tbl VALUES
('123_456_ABC_DEF'),
('12_34_456_XYZ_PQR'),
('LMN_OPQ_123_456');
-- DDL and sample data population, end
DECLARE @separator CHAR(1) = '_';
SELECT t.*
, REPLACE(c.query('data(/root/r[position() ge (last()-1)])').value('.', 'VARCHAR(256)')
, SPACE(1), @separator) AS Result
FROM @tbl AS t
CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA[' +
REPLACE(tokens, @separator, ']]></r><r><![CDATA[') +
']]></r></root>' AS XML)) AS t1(c);
3条答案
按热度按时间dtcbnfnu1#
这里有一个不可读的和有点疯狂的方式做它:-)
基本上就是反转文本,向前搜索,然后在结尾处反转....(SQL Server T-SQL)
nkoocmlb2#
请尝试以下解决方案。
它基于通过XML和XQuery的 * 标记化 *。
值得注意的要点:
CROSS APPLY
正在将输入标记为XML。[position() ge (last()-1)]
给出了最后两个标记。| 代币|结果|
| - ------|- ------|
| 123_456_ABC_定义|ABC_定义|
| 12_34_456_XYZ_生产工艺评定报告|XYZ_PQR|
| LMN_OPQ_123_456|123 - 456|
bq8i3lrv3#
这是使用JSON和
CROSS APPLY
的另一种选择