SQL Server 如何编写选择查询从Json对象获取索引值

cuxqih21  于 2023-01-08  发布在  其他
关注(0)|答案(3)|浏览(141)

我有下面的JSON对象。我需要写一个选择查询来获取Object JSON数组的索引值。类似于获取序列值。

{
  "Model": [
    {
      "ModelName": "Test Model",    
      "Object": [
         {
           "ID": 1,
           "Name": "ABC",
         },
         {
           "ID": 11,
           "Name": "ABCD",
         },
          {
           "ID": 15,
           "Name": "ABCDE",
         },
   ]  
}]}

预期输出:

Index_Value
  1
  2
  3
whhtz7ly

whhtz7ly1#

如果我没理解错的话,你想得到Object JSON数组中项目的索引,你需要使用默认模式的OPENJSON(),结果是一个包含keyvaluetype列的表,对于JSON数组,key列保存数组中每个项目的索引(从0开始):
我的天啊

DECLARE @json nvarchar(max) = N'{
   "Model":[
      {
         "ModelName":"Test Model",
         "Object":[
            {
               "ID":1,
               "Name":"ABC"
            },
            {
               "ID":11,
               "Name":"ABCD"
            },
            {
               "ID":15,
               "Name":"ABCDE"
            }
         ]
      }
   ]
}'

声明:

SELECT CONVERT(int, j2.[key]) + 1 AS item_id
FROM OPENJSON (@json, '$.Model') j1
CROSS APPLY OPENJSON(j1.[value], '$.Object') j2

但如果您想获取Object JSON数组中ID键的值,则语句不同:

SELECT j2.ID
FROM OPENJSON (@json, '$.Model') j1
CROSS APPLY OPENJSON(j1.[value], '$.Object') WITH (
   ID int '$.ID'
) j2

注意,需要调用两次OPENJSON(),因为输入的JSON是嵌套的数组结构,当然,如果Model JSON数组总是一个元素,可以使用适当的path来简化语句:

SELECT CONVERT(int, [key]) + 1 AS item_id
FROM OPENJSON (@json, '$.Model[0].Object')

最后,要获取indexIDName,应使用以下语句,该语句假定$.Model JSON数组有多个项,并使用适当的数据类型定义IDName列:

SELECT 
   CONVERT(int, j2.[key]) + 1  AS ItemID, 
   j3.ID, j3.Name
FROM OPENJSON (@json, '$.Model') j1
CROSS APPLY OPENJSON(j1.[value], '$.Object') j2
CROSS APPLY OPENJSON(j2.[value], '$') WITH (
   ID int '$.ID',
   Name varchar(50) '$.Name'
) j3
8yparm6h

8yparm6h2#

DECLARE @json nvarchar(max) = N'{
   "Model":[
      {
         "ModelName":"Test Model",
         "Object":[
            {
               "ID":1,
               "Name":"ABC"
            },
            {
               "ID":11,
               "Name":"ABCD"
            },
            {
               "ID":15,
               "Name":"ABCDE"
            }
         ]
      }
   ]
}'
declare @i int=0; 
SELECT 
   j2.ID, j2.Name
FROM OPENJSON (@json, '$.Model') j1
CROSS APPLY OPENJSON(j1.[value],concat('$.Object[',@i,']')) WITH (
   ID i`enter code here`nt '$.ID', Name varchar(100) '$.Name'
) j2

结果:
| 识别号|姓名|
| - ------|- ------|
| 十一|ABCD语言|

p3rjfoxz

p3rjfoxz3#

你可以用crossjoin选择select子句中不需要提及的键列。

SELECT 
   distinct t.id,
   JSON_VALUE(AttsData.[value], '$.address') as address,
   JSON_VALUE(AttsData.[value], '$.name') as name,
   JSON_VALUE(AttsData.[value], '$.owner_name') as owner_name,
   JSON_VALUE(AttsData.[value], '$.project') as project
   ,CONVERT(int, AttsData.[key]) index_id
   FROM mytablewithjsonfeild t
   CROSS APPLY OPENJSON (t."jsonfeild",N'$.parentkey') as   AttsData

在上面的查询中,我从表中交叉连接了JSON字段,并在select语句中获取了特定的键。
CONVERT(int, AttsData.[key])以获取元素的索引

相关问题