【问题标题】:How can I split rows into one row for each element in a JSON array stored in a column?如何将存储在列中的 JSON 数组中的每个元素的行拆分为一行?
【发布时间】: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 搜索将引导您找到它的文档。
  • 我一直在尝试,但我没有成功理解如何达到我想要的行为。我提取数据没有问题,但是在创建多行数据时 - 我被卡住了。我可能不擅长描述我的问题,但请至少指出我可以找到答案的方向。在正确定义问题之前,没有必要投反对票。

标签: sql-server tsql open-json


【解决方案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;

【讨论】:

  • 这非常有用!非常感谢!此外,响应时间也得到了额外的赞誉。
  • 太棒了 - 谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多