SQL Server 使用openjson从JSON中获取包含多个元素数组的列

8cdiaqws  于 2023-01-04  发布在  其他
关注(0)|答案(2)|浏览(269)

JSON输入如下所示:

{
"reporting.unit": [ "F-1", "F-2", "F-3"],
"notional.lc": [  100.1, 140.2, 150.3]
}

预期输出:
| reporting.unit | notional.lc |
| - ------| - ------|
| F-1战斗机|100.1页|
| F-2战斗机|140.2美元|
| F-3|一百五十点三|
注意,我有20多列和更多的元素
我试过:

DECLARE @json nvarchar(max);
    SELECT @json = '{
    "reporting.unit": [ "F-1", "F-2", "F-3"],
    "notional.lc": [  100.1, 140.2, 150.3]
    }';
    SELECT *
    FROM OPENJSON (@json);

但结果是
| 钥匙|价值|类型|
| - ------| - ------| - ------|
| reporting.unit| ["F-1"、"F-2"、"F-3"]|四个|
| notional.lc | [项目100.1、140.2、150.3]|四个|

5f0d552i

5f0d552i1#

您可以将OPENJSON与多个JOIN一起使用,以便使用数组键将列连接在一起,从而获得列/行格式的值。

DECLARE @json nvarchar(max);
SELECT @json = '{
"reporting.unit": [ "F-1", "F-2", "F-3"],
"notional.lc": [  100.1, 140.2, 150.3]
}';
SELECT 
  a.value AS [reporting.unit],
  b.value AS [notional.lc]
FROM OPENJSON(@json, '$."reporting.unit"') a
JOIN OPENJSON(@json, '$."notional.lc"') b 
ON a.[key] = b.[key]
    • 结果:**

| reporting.unit | notional.lc |
| - ------| - ------|
| F-1战斗机|100.1页|
| F-2战斗机|140.2美元|
| F-3|一百五十点三|

6rvt4ljy

6rvt4ljy2#

格里夫的答案已经+1了......这也是我的第一个想法。
然而,只是为了好玩,我想尝试一种替代品**,奇怪的是,它的批量成本较低,分别为40%和60%(下图)**
我还应该注意到,2016需要文字,而2017+可以是表达式

示例

DECLARE @json nvarchar(max);
SELECT @json = '{
"reporting.unit": [ "F-1", "F-2", "F-3"],
"notional.lc": [  100.1, 140.2, 150.3]
}';

Select ReportingUnit = JSON_VALUE(@json,concat('$."reporting.unit"[',N,']'))
      ,NotionalLC    = JSON_VALUE(@json,concat('$."notional.lc"[',N,']'))
 From ( Select Top 25 N=-1+Row_Number() Over (Order By (Select NULL)) 
          From master..spt_values n1
      ) A
 Where JSON_VALUE(@json,concat('$."reporting.unit"[',N,']')) is not null

结果

ReportingUnit   NotionalLC
F-1             100.1
F-2             140.2
F-3             150.3

图像

相关问题