我有一张table,看起来像这样:
ProductId, Color
"1", "red, blue, green"
"2", null
"3", "purple, green"
我想把它扩展到这一点:
ProductId, Color
1, red
1, blue
1, green
2, null
3, purple
3, green
实现这一目标最简单的方法是什么?在进程中没有循环是可能的吗?
我有一张table,看起来像这样:
ProductId, Color
"1", "red, blue, green"
"2", null
"3", "purple, green"
我想把它扩展到这一点:
ProductId, Color
1, red
1, blue
1, green
2, null
3, purple
3, green
实现这一目标最简单的方法是什么?在进程中没有循环是可能的吗?
8条答案
按热度按时间mnowg1ta1#
请看一下这个函数。我在Oracle中使用过类似的技巧来拆分和转置数据。循环遍历数据,将解码值插入到临时表中。唯一的问题是,微软会让你即时完成这项工作,而甲骨文需要一个明确的临时表。
MS SQL Split Function
Better Split Function
**作者编辑:**这很管用。最终代码如下所示(在创建Split函数之后):
ecfdbz9o2#
根据您的表格:
创建一个新表,如下所示:
它具有包含值1到8000左右的行。
这将返回您想要的内容:
编辑
以下是一个更好的查询,从@Christopher Klein的精彩回答中稍作修改:
我添加了“LTRIM()”,以便正确处理颜色列表中的空格:“红、蓝、绿”。他的解决方案不需要“红、蓝、绿”的空间。此外,我更喜欢使用我自己的数字表,而不是使用master.dbo.spt_Values,这也允许删除一个派生表。
编辑结束
以下是我的结果集:
这和你想要的顺序一样。
rkue9o1l3#
你可以试一下,不需要任何额外的功能:
whhtz7ly4#
这个问题是我在发帖10年后提出的。SQL SERVER 2016新增了STRING_SPLIT函数。通过使用这一点,可以编写如下代码。
nbysray55#
如果可能的话,修复您的数据库。数据库单元格中以逗号分隔的列表在99%或更多的情况下表示模式有缺陷。
toiithl66#
我将为此创建一个CLR表定义函数:
http://msdn.microsoft.com/en-us/library/ms254508(VS.80).aspx
这样做的原因是,CLR代码将更好地解析字符串(计算工作),并可以将该信息作为集合传回,这正是SQL Server真正擅长的(集合管理)。
CLR函数将根据解析的值(和输入的id值)返回一系列记录。
然后,您可以在表中的每个元素上使用交叉应用。
j2qf4p5b7#
只需将列转换为XML并对其进行查询。这里有一个例子。
bqucvtff8#
为什么不使用动态SQL来达到这个目的,就像这样(根据您的需要进行调整):
一个优点是您可以在任何SQL Server版本上使用它