Arrays 从T-SQL中数组的JSON中提取值

Arrays 从T-SQL中数组的JSON中提取值,arrays,json,tsql,Arrays,Json,Tsql,我有一个类似这样的JSON要在SQL中处理 {行索引:[1,2],数据:[a,b]} 我想提取数据,将其显示为这样一个表 RowIndex Data 1 a 2 b 我知道我必须使用OPENJSON、JSON_查询或JSON_值,但我找不到一种方法来获得我想要的内容,而这并不意味着要编写一个包含许多类似连接的查询 select C1.value as RowIndex, C2.value as Data, From (se

我有一个类似这样的JSON要在SQL中处理

{行索引:[1,2],数据:[a,b]}

我想提取数据,将其显示为这样一个表

RowIndex    Data
  1           a
  2           b
我知道我必须使用OPENJSON、JSON_查询或JSON_值,但我找不到一种方法来获得我想要的内容,而这并不意味着要编写一个包含许多类似连接的查询

select  C1.value as RowIndex,
        C2.value as Data,
From (select [key], value from OPENJSON(JSON_QUERY(@jsonstring, '$.RowIndex'))) C1 
inner join (select [key], value from OPENJSON(JSON_QUERY(@jsonstring, '$.Data'))) C2 on C1.[key] = C2.[key] 

因为如果JSON中的数组增长,查询将变得不可管理且速度缓慢,只需使用两个OPENJSON子句即可:

声明@JSON nvarcharMAX=N'{RowIndex:[1,2],数据:[a,b]}'; 选择RI.[value]作为行索引, D.[值]作为数据 从…起OPENJSON@JSON 使用RowIndex nvarcharMAX作为JSON, 数据nvarcharMAX作为JSON J 交叉应用OPENJSONRowIndex RI 交叉应用OPENJSONData D 其中RI.[key]=D.[key]; 不过,为了详细说明我的评论,您似乎应该修复JSON设计,并采用如下方式:

[
    {
        "RowIndex": "1",
        "Data": "a",
        "Number": "1"
    },
    {
        "RowIndex": "2",
        "Data": "b",
        "Number": "3"
    }
]
更容易查询的是:

声明@JSON nvarcharMAX=N'[ { 行索引:1, 数据:a, 编号:1 }, { 行索引:2, 数据:b, 电话:3 } ]'; 挑选* 从…起OPENJSON@JSON 使用RowIndex int, 数据字符1, 编号int OJ;
如果我理解得很好,如果我有3个数组,那么就会有3个OPENJSON,等等,@MattiaGiacone,还有更多的WHERE子句。然而,如果是这样的话,那么真正的问题似乎是JSON,您的JSON应该看起来更像这样添加了一个额外的节点,编号:[{RowIndex:1,Data:a,Number:1},{RowIndex:2,Data:b,Number:3}]如果我可以生成类似于{[{RowIndex:0,Data:a},{RowIndex:1,Data:b}的JSON,那就更好了要执行类似于选择JSON_值[VALUE]、“$.RowIndex”作为RowIndex、JSON_值[VALUE]、“$.Data”作为数据的查询,请从选择[key]、[VALUE]、[type]FROMOPENJSON@jsonstring为什么要在MattiaGiacone发布JSON_值?比较慢,我今天早些时候确认的。是的,这样更好。真正的Json有12个数组,对于250个元素和12个交叉应用,大约需要1秒。但是如果我以另一种方式创建json,查询几乎是即时的