我有一个 SQL Server 数据库表,在许多列中保存逗号分隔的值。例如:
ID | B栏 | c栏 |
---|---|---|
1 | 甲、乙、丙、 | 1,2,3, |
2 | d、、f、 | 4,5,6, |
3 | g,h,i,j, | 7, ,9,8, |
我想将所有列拆分为行,输出应该是这样的:
ID | B栏 | c栏 |
---|---|---|
1 | A | 1 |
1 | 乙 | 2 |
1 | C | 3 |
2 | d | 4 |
2 | 5 | |
2 | F | 6 |
3 | G | 7 |
3 | H | |
3 | 我 | 9 |
3 | j | 8 |
我刚刚给出了如何将这些转换为行的想法,但我的实际列超过 30 列,需要用逗号分隔。
小提琴
如果是这样,那么您的 SQL Server 版本不是实际的。请参阅@Luuk的评论。
小提琴
但这个查询不是确定性的。
在数据库中拥有逗号分隔列表是一种反模式,并且拥有多个需要根据列表中的顺序进行关联的此类逗号分隔列表是一种巨大的反模式。
这应该在不同的表中表示。
希望此查询的目的就是这样做。几个替代方案......
开放式JSON
由于序数 to
STRING_SPLIT
显然不适合您 - 您可以使用OPENJSON
作为替代方案。下面的内容适用于 SQL Server 2016+(并且您必须至少使用该版本,因为您确实有
STRING_SPLIT
无序数)。b
如果您发现和中c
包含导致构造无效 JSON 数组的字符,您可能需要添加代码来转义字符。递归CTE
如果您要处理许多此类列,您甚至可以考虑递归 CTE 方法。与其他方法相比,这确实增加了一些开销,但它确实允许您每次迭代执行多个列,并避免之后需要按序数对它们进行分组或连接。
db<>小提琴?