无法使用 OPENJSON 按索引访问键

Cannot access keys by index with OPENJSON

在SQL中,如何通过索引[0]提取键的值?或者,从这个 JSON 结构中提取值的最佳方法是什么?

declare @jsonString nvarchar(max)

set @jsonString = '{
"action": "edit",
"data": {
    "Accountable Inventory Technician|99999": {
        "PosTitle": "Accountable Inventory TECH",
        "Publish": "true"
    }
}
}'

这会得到键的名称,"action" 和 "data":

select [key]
from OPENJSON(@jsonString, '$')

这将获取数据 "Accountable Inventory Technician..." 下第一个键的值:

select *
from OPENJSON(@jsonString, '$.data')

我无法获取 "action" 的值。这个returns没什么:

select *
from OPENJSON(@jsonString, 'lax $.action')

我无法通过索引引用。这个returns没什么:

select *
from OPENJSON(@jsonString, '$.data[0].PosTitle')

我做错了什么?

In SQL, how do I extract the value of a key by index [0]? OR, what is the best way to extract a value from this JSON structure?

JSON 索引用于数组。例如,如果您的 JSON 具有 ["some","values","in","an","array"],则引用 [0] 项将具有 "some" 值。 您的示例没有数组,因此您将无法以这种方式访问​​它。

I cannot get the value of "action".

使用 JSON_VALUE 您可以访问对象中的特定项目:

SELECT JSON_VALUE(@jsonString, '$.action') [action];
SELECT JSON_VALUE(@jsonString, '$.data."Accountable Inventory Technician|99999".PosTitle') PosTitle;

如果您的 JSON 存储在 table 中,您可以使用 OPENJSONCROSS APPLY

访问它
DROP TABLE IF EXISTS #json 
CREATE TABLE #json (JsonString NVARCHAR(MAX));

INSERT #json SELECT '{
    "action": "edit",
    "data": {
        "Accountable Inventory Technician|99999": {
            "PosTitle": "Accountable Inventory TECH",
            "Publish": "true"
        }
    }
    }'

SELECT * FROM #json j
CROSS APPLY
OPENJSON(j.JsonString)
WITH
    (
        [Action] varchar(255) '$.action',
        PosTitle varchar(255) '$.data."Accountable Inventory Technician|99999".PosTitle'
    );