如何将存储在列中的 JSON 数组中的每个元素的行拆分为一行?

Posted

技术标签:

【中文标题】如何将存储在列中的 JSON 数组中的每个元素的行拆分为一行?【英文标题】:How can I split rows into one row for each element in a JSON array stored in a column? 【发布时间】:2020-03-17 15:16:40 【问题描述】:

好的,所以,这很难解释,但我会试一试。 Google 没有帮助我,所以如果它可以帮助其他人,请更新这个问题。

背景

我有一张表,Persons,其中有一些列,例如 [ID]、[Name] 和 [PhoneNumbers]。该表正在填充来自第三方系统的数据,因此我无法更改我们插入数据的方式。

[PhoneNumbers] 列包含一个 JSON 数字数组,如下所示:

"phonenumbers":[]

我现在正在尝试针对该表编写一个视图,目标是为每个数字保留一行。

问题

我可以使用 T-SQL 实现这一点并且它支持 JSON 吗?我正在使用 SQL Server 2016。

【问题讨论】:

“我可以使用 T-SQL 并且它支持 JSON 来实现吗?” 是的,OPENJSON 有什么问题?您的 Google 搜索引导您找到它的文档。 我一直在尝试,但我没有成功理解如何达到我想要的行为。我提取数据没有问题,但是在创建多行数据时 - 我被卡住了。我可能不擅长描述我的问题,但请至少指出我可以找到答案的方向。在正确定义问题之前,没有必要投反对票。 【参考方案1】:
declare @j nvarchar(max) = N'"phonenumbers":["1a", "2b", "3c", "4", "5", "6", "7", "8", "9", "10x"]';

select value, *
from openjson(@j, '$.phonenumbers');

declare @t table
(
id int identity,
phonenumbers nvarchar(max)
);

insert into @t(phonenumbers)
values(N'"phonenumbers":["1a", "2b", "3c", "4d"]'), (N'"phonenumbers":["22", "23", "24", "25"]'), (N'"phonenumbers":[]'), (NULL);

select id, j.value, j.[key]+1 as phone_no_ordinal, t.*
from @t as t
outer apply openjson(t.phonenumbers, '$.phonenumbers') as j;

【讨论】:

这非常有用!非常感谢!此外,响应时间也得到了额外的赞誉。 太棒了 - 谢谢!

以上是关于如何将存储在列中的 JSON 数组中的每个元素的行拆分为一行?的主要内容,如果未能解决你的问题,请参考以下文章

在 Postgres JSON 数组中查询

如何从以 BLOB 类型存储在列中的 XML 中提取数据(通过 SQL 查询)

在列中查找字母并提取包含特定字母的行

如何在 MySQL 中的 JSON 数组内的元素中提取特定属性的所有值?

将 json 对象中的元素数组保存到不同的行中

PySpark:如何在列中使用 Or 进行分组