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

4xrmg8kj  于 2021-08-04  发布在  Java
关注(0)|答案(2)|浏览(388)

好了,开始吧。我的第一个帖子和问题。
我正在使用sql server 2019。我有一个表,我对这个表中的两列很感兴趣。
两列都包含类似数组的数据(它们都是一组字符串,以逗号分隔)。我想从列中获取每个子字符串,并在它们自己的“单元格”中单独显示它们,而不是有许多行。
现在,我可以让它使用string\u split处理其中一列。但是,当我在两个列上使用string split时,我无法获得所需的顺序。i、 例如,见下文

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

column2: 'coffee','blue','dr_strange'

字符串的位置将始终匹配,因此第1列中的第3个条目将始终与第2列中的第3个条目相关。
但是当我把绳子分开的时候,顺序就乱了
我尝试过自我连接,子选择和混乱的秩序,但我只是不能得到它的工作秩序。
我已经在网上搜索了一段时间,所以我不只是来社区没有第一次尝试,我会感谢任何帮助或指导,我在这里寻找答案,当然,但我没有任何运气。
更新:请考虑以下事项:
这不是我自己做的,我正在潜入这个没有技术规范必须通过数据库,我相信你们中的一些人会知道我的痛苦。如果我得到批准,我会重新设计这个,但我现在不能(我可以做另一个表虽然)。数据以字符串列表的形式从这样的机器自动输入
每列大约有50个值
期望输出为:

这样做的关键是我可以在另一个软件中进行分析(同样,是一个请求),但是数组不能在软件中进行分类。
谢谢各位,
非常感谢

bprjcwpo

bprjcwpo1#

也许最好的解决方案是更改设计,但是如果需要解析输入数据,可以尝试基于json的方法。这个想法是把价值观从 column1 以及 column2 列转换为有效的json数组( my_fav_drink, my_fav_colour, my_fav_avenger 进入 ["my_fav_drink", "my_fav_colour", "my_fav_avenger"] )并使用 OPENJSON() 和默认架构。结果来自 OPENJSON() 执行是一个包含列的表 key , value 以及 type 以及 key 列是输入数组中元素的索引。
表格:

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
yruzcnhs

yruzcnhs2#

这是一个有点长的评论。
你存储值的方法真的非常糟糕。例如,保证两列具有相同数量的值是很麻烦的。然后想象一下如果其中一个值有逗号会发生什么!
基本上有四种选择。
如果你知道这些列是什么,就把它们存储起来!如果有些行有 NULL 价值观。那很好。如果您想更进一步,可以在不同的表中存储不同的列集。
(1)的一个变体是使用稀疏列。这允许比通常在行上允许更多的列——假设大多数值都是 NULL .
键值存储。也就是说,您将有另一个表,每个“实体”有多行,每个键/值对有一行。这样的eav数据模型(实体属性值)可能非常强大,但它通常假定所有值都是相同的类型,并且排除了外键关系的定义。
使用xml或json对值进行编码。与在列中放置已用字段相结合,这提供了可扩展性和通常合理的性能。
请注意,在一个字符串中存储多个值的方法以及在另一个字符串中存储头的方法不在此列表中。

相关问题