在第三次出现“ _”之后返回文本

时间:2019-02-27 15:15:38

标签: sql sql-server tsql

这是我当前的查询

DECLARE @x varchar(100)
SET @x = '110_DT_H55_VXELQ318_10Q'
SELECT left(@x, CHARINDEX('_', REVERSE(@x))  )

这是我想要的结果: VXELQ318_10Q

2 个答案:

答案 0 :(得分:2)

您可以将字符串转换为XML并获取第4个片段:

DECLARE @x varchar(100)
SET @x = '110_DT_H55_VXELQ318_10Q'
SELECT CAST('<x>' +  REPLACE(@x,'_','</x><x>') + '</x>' AS XML).value('/x[4]','nvarchar(100)');

这将返回 VXELQ318

替换将创建类似XML的

<x>110</x>
<x>DT</x>
<x>H55</x>
<x>VXELQ318</x>
<x>10Q</x>

原生XML方法.value()允许您按元素的位置来寻址。

更新

以下内容将返回位置为>=4的所有片段

DECLARE @x varchar(100)
SET @x = '110_DT_H55_VXELQ318_10Q'
SELECT STUFF(
       CAST('<x>' +  REPLACE(@x,'_','</x><x>') + '</x>' AS XML)
            .query('for $nd in /x[position()>=4]/text()
                    return <y>{concat("_",$nd)}</y>')
            .value('.','nvarchar(100)'),1,1,'');

这将返回 VXELQ318_10Q

答案 1 :(得分:1)

这是使用PARSENAME的另一个选项。假设您的数据中没有任何句点,否则将无法正常工作。

DECLARE @x varchar(100)
SET @x = '110_DT_H55_VXELQ318_10Q'

select parsename(replace(right(@X, len(@x) - charindex('_', @X)), '_', '.'), 2) + '_' + parsename(replace(right(@X, len(@x) - charindex('_', @X)), '_', '.'), 1)