如何在sql中循环json数组以选择特定索引处的值

时间:2016-07-28 12:03:51

标签: sql-server json

我有一个存储过程查询数据库并将结果存储在Json变量中。现在我想通过索引循环遍历Json数组以获取特定值。有人能告诉我如何实现这一目标。以下是我的查询

 DECLARE @json NVARCHAR(Max)
 DECLARE @name VARCHAR(50) = 'Name'

 SET @json = (select name from getalldataView where 
 SOUNDEX(name) LIKE SOUNDEX(@name) FOR JSON PATH, ROOT('Names'))

 DECLARE @i int = 0

 WHILE @i < lengthOFArray
 BEGIN
       SET @i = @i + 1;

   SELECT value
   FROM OPENJSON(@json, '$.Names[',@i,']');

 END

4 个答案:

答案 0 :(得分:0)

当您开始查询以选择openjson时,是否可以再添加一列,并且该值是您的循环索引。 所以你可以在开始端添加另一个Where验证。 OpenJSON读取所有json并将其插入新行。

答案 1 :(得分:0)

来源Here

示例数据

{ "type": "MultiPolygon", 
    "coordinates": [
        [
            [[40, 40], [20, 45], [45, 30], [40, 40]]
        ], 
        [
            [[20, 35], [10, 30], [10, 10], [30, 5], [45, 20], [20, 35]], 
            [[30, 20], [20, 15], [20, 25], [30, 20]]
        ]
    ]
}

Sql代码

SELECT polygons.[key] as polygon, lines.[key] as line, x, y
FROM OPENJSON(@multipolygon, '$.coordinates') as polygons
       CROSS APPLY OPENJSON(polygons.value) as lines
              CROSS APPLY OPENJSON(lines.value)
                     WITH (x float '$[0]', y float '$[1]')

答案 2 :(得分:0)

Screenshot of result

我在这个示例中具有多层json数据,并使用交叉联接将它们存储在一个表结果中

 declare @jsondata nvarchar(max);
    set @jsondata ='{"id":1,"planTypeId":0,"locationId":0,"auditId":0,"empId":0,"accessID":"string","actionItem":"string","resUserID":0,"createdDate":"2019-09-12T13:22:23.805Z","dueDate":"2019-09-12T13:22:23.805Z","lastModified":"2019-09-12T13:22:23.805Z","completedDate":"2019-09-12T13:22:23.805Z","completedBy":0,"status":0,"desc":"string","relQuestionID":0,"catID":0,"equipmentID":0,"steps":[{"id":1,"trnPlanId":1,"dueDate":"2019-09-12T13:22:23.805Z","type":1,"quizId":0,"taskId":0,"docCourseUrl":"string","users":[{"id":1,"empId":1,"status":true}]},{"id":2,"trnPlanId":2,"dueDate":"2019-09-12T13:22:23.805Z","type":2,"quizId":0,"taskId":0,"docCourseUrl":"string","users":[{"id":2,"empId":2,"status":true},{"id":3,"empId":3,"status":true}]}]}';



    SELECT
        JSON_Value (c.value, '$.id') as Id, 
        JSON_Value (c.value, '$.type') as planTypeId, 
        JSON_Value (p.value, '$.id') as userId, 
        JSON_Value (p.value, '$.empId') as empId

    FROM OPENJSON (@jsondata, '$.steps') as c
    CROSS APPLY OPENJSON (c.value, '$.users') as p


    SELECT
        JSON_Value (c.value, '$.id') as Id, 
        JSON_Value (c.value, '$.type') as planTypeId

    FROM OPENJSON (@jsondata, '$.steps') as c

答案 3 :(得分:0)

类似的东西将从SQL Server 2017开始起作用。

        SET @i = 0;

        SET @length = 
        (SELECT COUNT(*) 
         FROM OPENJSON(@json,'$.names'))
        WHILE @i < @length
        BEGIN
            DECLARE @driverName NVARCHAR(100);
            SET @driverName = JSON_VALUE(@json,CONCAT('$.names[',@i,']'))
            -- do stuff here like call stored proc...
            SET @i = @i +1;
        END

如果您不需要调用存储的proc,而只需要以某种方式修改JSON,您可能会发现这很有用。 https://stackoverflow.com/a/59293083/7446265