1

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

declare @jsonString nvarchar(max)

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

这将为我提供键的名称,“动作”和“数据”:

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

这将为我提供数据“Accountable Inventory Technician...”下第一个键的值:

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

我无法获得“行动”的价值。这不返回任何内容:

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

我无法通过 index 引用。这不返回任何内容:

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

我究竟做错了什么?

4

1 回答 1

1

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

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

我无法获得“行动”的价值。

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

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

如果您的 JSON 存储在表中,您可以使用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'
    );
于 2018-04-24T16:49:35.853 回答