您可以利用SQL Server的XML支持的优势,将输入字符串转换成XML值,并对其进行查询。
例如,下面的查询将替换每个;
与</b><a>
并且每个,
到</a><b>
把每个字符串转换成<a>100000161</a><a>100000243</a><a />
。在此之后,你可以用/a[1]
选择单个<a>
节点,/a[2]
:
declare @table table (it nvarchar(200))
insert into @table values
('100000161, 100000031; 100000243, 100000021;'),
('100000161, 100000031; 100000243, 100000021;')
select
xCol.value('/a[1]','nvarchar(200)'),
xCol.value('/a[2]','nvarchar(200)')
from (
select convert(xml, '<a>'
+ replace(replace(replace(it,';','</b><a>'),',','</a><b>'),' ','')
+ '</a>')
.query('a') as xCol
from @table) as tmp
-------------------------
A1 A2
100000161 100000243
100000161 100000243
value
提取从XML字段中的一个值。 nodes
返回与XPath表达式匹配的节点表。下面的查询将返回所有“钥匙”:
select
a.value('.','nvarchar(200)')
from (
select convert(xml, '<a>'
+ replace(replace(replace(it,';','</b><a>'),',','</a><b>'),' ','')
+ '</a>')
.query('a') as xCol
from @table) as tmp
cross apply xCol.nodes('a') as y(a)
where a.value('.','nvarchar(200)')<>''
------------
100000161
100000243
100000161
100000243
随着200K行的数据,虽然,我会认真考虑加载它并将其存储在indivisual,可转位的列时,转换数据,或添加单独 ,相关表格。在列上应用字符串操作函数意味着服务器不能使用任何覆盖索引来加速查询。
如果这是不可能的(为什么?)我会考虑至少添加一个单独的XML类型的列,它将包含XML格式的相同数据,以允许创建XML索引。
SQL Server在企业数据库中因臭名昭着的正则表达式替换支持而臭名昭着,这可能是您希望用于此问题的原因。你有可能把这些数据擦洗到别的地方吗? –
@TimBiegeleisen无论正则表达式支持多么糟糕,在任何正则表达式引擎中,这个简单的东西都不会成为问题。正则表达式也是你绝对不想用于这个任务的东西。 – Tomalak
@Tomalak SUBSTRING_INDEX不是SQL Server函数,它是_MySQL_函数,是的,正则表达式就是你想在这里使用的东西。 –