【发布时间】:2018-06-30 20:46:35
【问题描述】:
我有 2 个需要字符串拆分的表。结果表将拆分字符串以创建 new year、make、model 列。这是示例 2 表。
CREATE TABLE Table1
(
sku varchar(50),
Conca varchar(max)
);
INSERT INTO Table1 (sku, Conca)
VALUES ('AVS1234','Game;Consoles/Year;2001/ Year;2002/ Year;2006/ Year;2007/ Year;2009/ Year;2011/Make;XBox/Model;100/'),
('AVS1234','Game;Consoles/Year;2016/Make;Nintendo/Model;DX/'),
('AVS1234','Game;Consoles/Year;2001/ Year;2002/ Year;2006/ Year;2007/ Year;2009/ Year;2011/Make;PS/Model;300/Model;500/');
CREATE TABLE Table2
(
sku2 varchar(50),
Conca2 varchar(max)
);
INSERT INTO Table2 (sku2, Conca2)
VALUES ('AVS1234','<tr><td>2011 </td><td>Xbox </td><td>100; Notes : 2 pc.; Stainless</td></tr>'),
('AVS1234','<tr><td>2005 </td><td>Xbox </td><td>100; Notes : 2 pc.; Stainless</td></tr>'),
('AVS1234','<tr><td>2016 </td><td>Xbox </td><td>300</td></tr>');
预期结果表1
Sku year make model
--------------------------
avs1234 2001 XBox 100
avs1234 2002 XBox 100
avs1234 2006 XBox 100
avs1234 2007 XBox 100
avs1234 2009 XBox 100
avs1234 2011 XBox 100
AVS1234 2016 Nintendo DX
AVS1234 2001 PS 300
AVS1234 2002 PS 300
AVS1234 2006 PS 300
AVS1234 2007 PS 300
AVS1234 2009 PS 300
AVS1234 2011 PS 300
AVS1234 2001 PS 500
AVS1234 2002 PS 500
AVS1234 2006 PS 500
AVS1234 2007 PS 500
AVS1234 2009 PS 500
AVS1234 2011 PS 500
预期结果表2
Sku year make model Notes
------------------------------------
avs1234 2001 XBox 100 2 pc.; Stainless
avs1234 2002 XBox 100 2 pc.; Stainless
AVS1234 2005 Xbox 100 2 pc.; Stainless
AVS1234 2016 Xbox 300
首先我想尝试以下位置/修剪方法:
Cross Apply
(Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
但 # 年的范围可能从 1950 年代到 2018 年及以后。所以这会产生太多的“pos”。
然后我尽我所能:
with firstpass as
(
SELECT A.sku,
Split.a.value('.', 'VARCHAR(100)') AS Data
FROM
(SELECT sku,
Cast('<M>' + replace((Select replace(Conca,'year','§§Split§§') as [*] For XML Path('')),'§§Split§§','</M><M>')+'</M>' as xml) as Data
FROM table1) AS A
CROSS APPLY
Data.nodes ('/M') AS Split(a)
)
SELECT
*, Year = SUBSTRING([data], 1 ,
case when CHARINDEX('/', [data] ) = 0 then LEN([data])
else CHARINDEX('/', [data]) -1 end)
from firstpass
我不知道下一步该去哪里……请帮忙。
【问题讨论】:
-
老实说,SQL Server 使用该数据的情况很糟糕。您可能可以为第一个表创建预期的结果,但第二个将是一个问题。 SQL Server 没有 html 上下文,因此您不会有简单的方法将数据从标记中剥离出来。我认为您可能会更好地使用文本解析工具,而不是 SQL Server。
-
@Larnu 虽然主要是正确的方法是使用 patindex 进行正则表达式和模式匹配,但无论如何它都很可怕并且感觉不对。
-
另外,你为什么还要在表格中保存 html 标记??
-
我正在考虑使用替换从表 2 中删除所有 html 标签。但是对表 1 有什么建议吗?
-
我没有时间测试或编写查询,但我会使用几个
SFRING_SPLITs 来获得第一个结果。首先是/,然后是;。您将需要更多CROSS APPLY和一些CASE表达式
标签: sql sql-server split