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的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);
来源:@SRIRAM's answer
我 运行 遇到的问题是将两次分隔的字符串拆分为两列 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的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);
来源:@SRIRAM's answer