我遇到的问题是将两个分隔的字符串分割成两个列表。在使用单个分隔符将字符串转换为表时,我已经找到了大量的资源,但在使用两个分隔符时遇到了困难。
这种情况的用例是用于电子商务过滤存储的过程。客户端可以自己管理过滤器( Id),因此存储的proc需要在动态数量的条件下工作。用户在第一个过滤器下选择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 这将允许基于结果的基于集合的事务,这将加快速度。
发布于 2015-08-14 18:08:44
使用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;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);SQL Fiddle Demo2
https://stackoverflow.com/questions/32015887
复制相似问题