在 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 中,我需要拆分多个列,根据逗号分隔保持数据有序的主要内容,如果未能解决你的问题,请参考以下文章

使用逗号分隔符将单个 CSV 列批量转换为多个

如何使用逗号分隔值拆分列并存储在 PySpark Dataframe 中的数组中?如下所示

SQL 2005 在分隔符上拆分逗号分隔列

在Python中使用多个分隔符拆分字符串[重复]

拆分和合并列中唯一的 SQL 逗号分隔值,然后分组

SQL Server 逗号分隔列到多列