如何将存储在列中的 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 数组中的每个元素的行拆分为一行?的主要内容,如果未能解决你的问题,请参考以下文章
如何从以 BLOB 类型存储在列中的 XML 中提取数据(通过 SQL 查询)