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

时间:2015-08-14 17:45:38

标签: sql tsql sql-server-2014

我遇到的问题是将两次分隔的字符串拆分为两列表。我发现有很多资源可以使用单个分隔符将字符串转换为表格,但是在使用两个分隔符时遇到了困难。

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

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

我想要实现的是一个返回下表的函数......

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

我将继续沿着这条道路发布更新。

更新:

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

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

这样就可以在结果上进行基于集合的交易,从而加快速度。

1 个答案:

答案 0 :(得分:1)

使用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