在 SSMS 中,我需要拆分多个列,根据逗号分隔保持数据有序
Posted
技术标签:
【中文标题】在 SSMS 中,我需要拆分多个列,根据逗号分隔保持数据有序【英文标题】:In SSMS I need to split more than one column, keeping the data in order, based on comma separation 【发布时间】:2021-03-30 16:40:28 【问题描述】:我有来自客户来源的数据,我需要根据两个字符串中的逗号进行拆分。这两个字符串是链接的,即 A 列中的位置 1 应该链接到 B 列中的位置 1 等。到目前为止,我从一个类似的问题中获取并修改的内容如下,但它没有在第一个之前返回结果逗号,之后只返回一组结果。我有一些行,该字段最多包含大约 50 个逗号分隔符...
请注意,STRING_SPLIT 在这里不起作用,因为我需要类别才能匹配正在拆分的其他字段...
;WITH tmp ([Product Id],
[Product Reference],
[Active],
[Name],
[Price (exc# VAT)],
DataItem1,
[Categories Ids],
DataItem2,
[Categories Names],
[Images]) AS
(
SELECT
[Product Id],
[Product Reference],
[Active],
[Name],
[Price (exc# VAT)],
LEFT([Categories Ids], CHARINDEX(',', [Categories Ids] + ',') - 1),
STUFF([Categories Ids], 1, CHARINDEX(',', [Categories Ids] + ','), ''),
LEFT([Categories Names], CHARINDEX(',', [Categories Names] + ',') - 1),
STUFF([Categories Names], 1, CHARINDEX(',', [Categories Names] + ','), ''),
Images
FROM customerdata..products
UNION all
SELECT
[Product Id],
[Product Reference],
[Active],
[Name],
[Price (exc# VAT)],
LEFT([Categories Ids], CHARINDEX(',', [Categories Ids] + ',') - 1),
STUFF([Categories Ids], 1, CHARINDEX(',', [Categories Ids] + ','), ''),
LEFT([Categories Names], CHARINDEX(',', [Categories Names] + ',') - 1),
STUFF([Categories Names], 1, CHARINDEX(',', [Categories Names] + ','), ''),
Images
FROM tmp
WHERE
[Categories Ids] > ''
AND [Categories Names] > ''
)
SELECT
[Product Id] AS PROD_ID,
[Product Reference] AS PROD_REF,
[Active],
[Name],
[Price (exc# VAT)] AS PRICE,
[Categories Ids] AS CAT_NO,
[Categories Names] AS CAT_NAME,
[Images]
FROM tmp
ORDER BY PROD_REF
OPTION (maxrecursion 0)
编辑:上面的查询来自其他地方的类似问题,老实说,我不确定它是否会接近我的要求,我只是尝试了这个并且......失败了!
按要求提供样本数据:
Desired Output 将 Category ID 和 Category Names 列拆分为新行:
【问题讨论】:
请提供样本数据和期望的结果。而且,目前还不清楚该查询与它上面的问题有什么关系。 您使用的是哪个版本的 SQL Server? 请分享输出数据。 SQL Server 2019 因此,需要将类别 ID 和类别名称列与每个项目的相关部分引用等一起分离和过滤。某些类别列可以包含 50 多个类别,以逗号分隔。我希望这是有道理的。提供的示例仅显示了两个类别。 【参考方案1】:将逗号分隔的字符串转换为有效的 JSON 数组并使用 OPENJSON,它将数组成员的序号位置作为单独的列输出。 EG
select *
from openjson('[10,20,30,40]')
输出
key value type
--------- ------------- ----
0 10 2
1 20 2
2 30 2
3 40 2
然后就可以使用位置来加入对应的ID和Names了。
【讨论】:
谢谢,但老实说,我不知道如何转换成 JSON 数组 在您的问题中粘贴示例数据(不是示例数据的图片)。以上是关于在 SSMS 中,我需要拆分多个列,根据逗号分隔保持数据有序的主要内容,如果未能解决你的问题,请参考以下文章