Sql 选择第三个和第四个管道分隔符之间的字符串

Sql 选择第三个和第四个管道分隔符之间的字符串,sql,sql-server,regex,substring,charindex,Sql,Sql Server,Regex,Substring,Charindex,我有一个列,其中包含如下值 Column Asset|Class1|Category1|Group1|Account1 Expense|Class23|Category23|Group23|Account23 我想选择管道分隔符第3次和第4次出现之间的字符串,如何实现这一点 我尝试过PARSENAME和charindex+stuff函数,但它们有一些限制,比如最多128个字符。此外,我们的SQL server对正则表达式的支持有限。有什么想法吗 选择反转(PARSENAME(反转(替换(LTR

我有一个列,其中包含如下值

Column
Asset|Class1|Category1|Group1|Account1
Expense|Class23|Category23|Group23|Account23
我想选择管道分隔符第3次和第4次出现之间的字符串,如何实现这一点

我尝试过PARSENAME和charindex+stuff函数,但它们有一些限制,比如最多128个字符。此外,我们的SQL server对正则表达式的支持有限。有什么想法吗

选择反转(PARSENAME(反转(替换(LTRIM(列)、“|”和“.”),3))

我的选择需要返回: 第一组 第23组也许这会有所帮助

示例

Declare @YourTable table (ID int,[Column] varchar(max))
Insert Into @YourTable values
 (1,'Asset|Class1|Category1|Group1|Account1')
,(2,'Expense|Class23|Category23|Group23|Account23')

Select ID
      ,SomeValue = convert(xml,'<x>' + replace([Column],'|','</x><x>')+'</x>').value('/x[3]','varchar(100)')
 From @YourTable
如果您有2016,也可以使用+

CREATE TABLE T(
  ID INT IDENTITY(1,1),
  Str VARCHAR(45)
);

INSERT INTO T(Str) VALUES 
('Asset|Class1|Category1|Group1|Account1'),
('Expense|Class23|Category23|Group23|Account23');

SELECT V Str
FROM (
       SELECT Value V,
              ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID) RN
       FROM T CROSS APPLY STRING_SPLIT(Str, '|')
     ) TT
WHERE RN = 3;
返回:

Str
---------
Category1
Category23

导入数据时,您不能修复数据,使其进入多列吗?是否可以修复设计并将这些值放在单独的列中?这是处理这个问题的最好方法。什么版本的SQL?如果需要,您可以使用splitstring:或创建自己版本的函数。有大量的拆分字符串函数返回元素号,允许您交叉应用字符串列,然后仅选择第三项,例如。@user_KoBy很乐意帮助您了解字符串的顺序没有GTD_split()。完全披露,我还没有看到它失败,但再一次,我还没有被闪电击中不仅仅是2016+版本,您的数据库还必须设置为兼容级别130。
Str
---------
Category1
Category23