SQL 将两次分隔的字符串拆分为两列 table

SQL Splitting a twice delimited string into a two column table

我 运行 遇到的问题是将两次分隔的字符串拆分为两列 table。我找到了很多关于使用单个定界符将字符串转换为 table 的资源,但使用两个定界符时遇到了困难。

此用例用于电子商务过滤存储过程。客户端可以自己管理过滤器(Id),因此存储过程需要处理动态数量的条件。用户在第一个过滤器下选择 2 个属性,然后在第二个过滤器下选择 3 个属性,依此类推。性能是最重要的,但我们将处理少量数据,我发现 xml 解析是最快的,但我在该领域的技能充其量只是中等水平。

我一直在看这篇文章,但一直无法理解它:https://www.mssqltips.com/sqlservertip/1771/splitting-delimited-strings-using-xml-in-sql-server/

我想要实现的功能是 returns 以下 table...

Input: 14-11,12,13|15-21,22,23
Output:
Id | Values
14 | 11, 12, 13
15 | 21, 22, 23

我会 post 在我继续这条路的时候更新。

更新:

实际上,我正在考虑这个问题,我认为这个问题的更好解决方案可能是...

Id | Values 
14 | 11 
14 | 12 
14 | 13 
15 | 21 
15 | 22
15 | 23 

这将允许基于结果的集合交易,这应该会加快速度。

使用MSSQL的leftcharindexsubstring函数,你可以轻松做到:

create table test(col1 varchar(50));

insert into test values
('14-11,12,13'),
('15-21,22,23');

select left(col1,charindex('-',col1)-1) as id, 
       substring(col1,charindex('-',col1)+1,len(col1)-charindex('-',col1)) as [values]
   from test;

SQL Fiddle Demo

对于您的更新版本,您可以使用 XML 来解析您的字符串并将其转换为这样的行:

SELECT A.id
    ,Split.a.value('.', 'VARCHAR(100)') AS [Values]
FROM (
    SELECT left(col1, charindex('-', col1) - 1) AS id
        ,CAST('<M>' + REPLACE(substring(col1, charindex('-', col1) + 1
            , len(col1) - charindex('-', col1)), ',', '</M><M>') + '</M>' AS XML) AS String
    FROM test
    ) AS A
CROSS APPLY String.nodes('/M') AS Split(a);

来源:@SRIRAM's answer

SQL Fiddle Demo2