如何将列中的字符串拆分为行(在两行上,匹配位置)SQL
好了,开始吧。我的第一篇帖子和问题 我正在使用SQL server 2019。我有一个表,我对这个表中的两列感兴趣 这两个列都包含类似数组的数据(它们都是一组字符串,以逗号分隔。我想从列中提取每个子字符串,并在它们自己的“单元格”中单独显示它们,而是有许多行 现在,我可以使用STRING_SPLIT处理其中一列。但是,当我在两列上都使用STRING SPLIT时,我得不到所需的顺序。例如,请参见下面的示例如何将列中的字符串拆分为行(在两行上,匹配位置)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
column1: 'my_fav_drink','my_fav_colour','my_fav_avenger'
column2: 'coffee','blue','dr_strange'
字符串的位置将始终匹配,因此第1列中的第3个条目将始终与第2列中的第3个条目相关
但是当我运行字符串拆分时,订单会被打乱
我曾尝试过自连接、子选择和与order by的混乱,但我似乎无法让它正常工作
我已经在网上搜索了一段时间,所以我不只是在没有尝试的情况下来到社区,我将感谢任何帮助或指导,我当然在这里寻找答案,但我没有任何运气
更新:请考虑以下内容:
非常感谢这篇评论有点长 您存储值的方法非常非常糟糕。例如,确保两列具有相同数量的值非常麻烦。然后想象一下,如果其中一个值可能有逗号,会发生什么 基本上有四种选择
NULL
值无关紧要,那就好了。如果您想更进一步,可以在不同的表中存储不同的列集NULL
请注意,在一个字符串中存储多个值并在另一个字符串中包含标题的方法不在此列表中。最好的解决方案可能是更改设计,但如果需要解析输入数据,可以尝试基于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中有很多值得怀疑的东西我想再次表示感谢,我认为重新设计已经完成的工作是最不痛苦的事情。我只需要查看数据以及这是如何发生的。谢谢!我需要一个快速解决方案,您已经提供了它。它工作得很好,我现在可以分析数据了,没有问题,我已经添加了积压工作中的一项任务是将表重新设计为永久解决方案。我非常感谢帮助更新:您的解决方案帮助我获得了所需的内容。此后,我获得了批准并重新设计了所有这些表:)哇哦