如何将列中的字符串拆分为行(在两行上,匹配位置)SQL

如何将列中的字符串拆分为行(在两行上,匹配位置)SQL,sql,sql-server,substring,Sql,Sql Server,Substring,好了,开始吧。我的第一篇帖子和问题 我正在使用SQL server 2019。我有一个表,我对这个表中的两列感兴趣 这两个列都包含类似数组的数据(它们都是一组字符串,以逗号分隔。我想从列中提取每个子字符串,并在它们自己的“单元格”中单独显示它们,而是有许多行 现在,我可以使用STRING_SPLIT处理其中一列。但是,当我在两列上都使用STRING SPLIT时,我得不到所需的顺序。例如,请参见下面的示例 column1: 'my_fav_drink','my_fav_colour','my_f

好了,开始吧。我的第一篇帖子和问题

我正在使用SQL server 2019。我有一个表,我对这个表中的两列感兴趣

这两个列都包含类似数组的数据(它们都是一组字符串,以逗号分隔。我想从列中提取每个子字符串,并在它们自己的“单元格”中单独显示它们,而是有许多行

现在,我可以使用STRING_SPLIT处理其中一列。但是,当我在两列上都使用STRING SPLIT时,我得不到所需的顺序。例如,请参见下面的示例

column1: 'my_fav_drink','my_fav_colour','my_fav_avenger'

column2: 'coffee','blue','dr_strange'
字符串的位置将始终匹配,因此第1列中的第3个条目将始终与第2列中的第3个条目相关

但是当我运行字符串拆分时,订单会被打乱

我曾尝试过自连接、子选择和与order by的混乱,但我似乎无法让它正常工作

我已经在网上搜索了一段时间,所以我不只是在没有尝试的情况下来到社区,我将感谢任何帮助或指导,我当然在这里寻找答案,但我没有任何运气

更新:请考虑以下内容:

  • 这不是我自己做的,我在没有技术规范的情况下潜入数据库,我相信你们中的一些人会知道我的痛苦。如果我得到批准,我会重新设计这个,但我现在不能(尽管我可以制作另一个表)。数据是从这样的机器自动输入的,作为字符串列表

  • 每列中大约有50个值

  • 期望输出为:

    这样做的全部目的是,我可以在另一个软件中进行分析(同样,这是一个请求),但阵列无法在软件中进行排序

    谢谢各位


    非常感谢

    这篇评论有点长

    您存储值的方法非常非常糟糕。例如,确保两列具有相同数量的值非常麻烦。然后想象一下,如果其中一个值可能有逗号,会发生什么

    基本上有四种选择

  • 如果您知道列是什么,请存储它们!如果某些行是否具有
    NULL
    值无关紧要,那就好了。如果您想更进一步,可以在不同的表中存储不同的列集
  • (1)的一个变体是使用。这允许比通常允许的行更多的列——假设大多数值为
    NULL
  • 键值存储。也就是说,您将有另一个表,其中每个“实体”有多行,每个键/值对有一行。这样的EAV数据模型(实体属性值)可能非常强大,但它通常假定所有值都是相同的类型,并且排除了外键关系的定义
  • 使用XML或JSON对值进行编码。结合将使用过的字段放入列中,这提供了可扩展性和合理的性能

  • 请注意,在一个字符串中存储多个值并在另一个字符串中包含标题的方法不在此列表中。

    最好的解决方案可能是更改设计,但如果需要解析输入数据,可以尝试基于JSON的方法。其思想是转换
    column1
    column2
    columns i中的值将有效的JSON数组(
    my_fav_饮料、my_fav_颜色、my_fav_复仇者
    转换为
    [“my_fav_饮料”、“my_fav_颜色”、“my_fav_复仇者”]
    )并使用
    OPENJSON()
    和默认模式解析数组执行是一个包含列
    类型
    的表,
    列中的值是输入数组中元素的索引

    表:

    CREATE TABLE Data (
       column1 varchar(100),
       column2 varchar(100)
    )
    INSERT INTO Data (column1, column2)
    VALUES ('my_fav_drink,my_fav_colour,my_fav_avenger', 'coffee,blue,dr_strange')
    
    声明:

    SELECT CONVERT(int, j1.[key]) + 1 AS [Number], j1.[value] AS [Label], j2.[value] AS [Value]
    FROM Data d
    CROSS APPLY OPENJSON(CONCAT('["', REPLACE(STRING_ESCAPE(d.column1, 'json'), ',', '","'), '"]')) j1
    CROSS APPLY OPENJSON(CONCAT('["', REPLACE(STRING_ESCAPE(d.column2, 'json'), ',', '","'), '"]')) j2
    WHERE j1.[key] = j2.[key]
    
    结果:

    Number  Label           Value
    1       my_fav_drink    coffee
    2       my_fav_colour   blue
    3       my_fav_avenger  dr_strange
    

    向我们展示您到目前为止所做的工作预期的输出是什么?首先不要将这些值存储在数据库中。这是一个严重的错误,打破了最基本的设计规则。SQL(语言)中没有隐含的顺序或者,除非它是由一个
    ORDER by
    子句指定的。SQL Server没有数组,您不能仅仅用字符串模拟它们。如果这些值的内容不变,您应该使用一个表,该表中的列名为
    my\u fav\u drink
    、my\u fav\u color
    my\u fav\u avenger`。这些列可以位于主表中(例如用户)或相关表格(如首选项)如果字段是高度可变的,不用于过滤,那么您可以考虑将这些值存储在XML或JSON字段中。这样我就不会以这样的方式存储它们,也许我可以有一些影响,但不是我的数据库,这些值是从这样的机器中自动产生的。在我加入后,我会努力完成他的工作。如果我可以从头开始重做,我会的,但这只是为了现在做一些分析。我感谢你的帮助,我认为选项3在这里可能有意义。请注意这不是我的方法,我进入这个新的公司,从一个在我加入后一天离开的人那里接管。这里有一个dbI中有很多值得怀疑的东西我想再次表示感谢,我认为重新设计已经完成的工作是最不痛苦的事情。我只需要查看数据以及这是如何发生的。谢谢!我需要一个快速解决方案,您已经提供了它。它工作得很好,我现在可以分析数据了,没有问题,我已经添加了积压工作中的一项任务是将表重新设计为永久解决方案。我非常感谢帮助更新:您的解决方案帮助我获得了所需的内容。此后,我获得了批准并重新设计了所有这些表:)哇哦