我遇到的问题是将两次分隔的字符串拆分为两列表。我发现有很多资源可以使用单个分隔符将字符串转换为表格,但是在使用两个分隔符时遇到了困难。
此用例用于电子商务过滤存储过程。客户端可以自己管理过滤器(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
这样就可以在结果上进行基于集合的交易,从而加快速度。
答案 0 :(得分:1)
使用MSSQL的left
,charindex
和substring
功能,您可以轻松完成此操作:
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;
对于您的更新版本,您可以使用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);