使用 WITH 时,如何获取 OPENJSON 中数组项的 "key"?
How do I get the "key" of an array item in OPENJSON, when using WITH?
我想在我的 sql-server 中解析一个 json-array。我想使用 OPENJSON
和 WITH
将特定值解析为列。如何获取每个数组项的索引?
我知道,这适用于 JSON_VALUE
和没有 WITH
:
DECLARE @json NVARCHAR(MAX) = '[{"name":"Alpha"},{"name":"Bravo"},{"name":"Charlie"}]'
SELECT [key], JSON_VALUE(value, '$.name')
FROM OPENJSON(@json)
-- key | value
----------------------------------
-- 0 | Alpha
-- 1 | Bravo
-- 2 | Charlie
但是当我添加 WITH
时,我似乎无法再访问 key
。
SELECT [key], name
FROM OPENJSON(@json)
WITH (
[key] INT, -- does not work
name NVARCHAR(MAX)
)
-- key | name
----------------------------------
-- NULL | Alpha
-- NULL | Bravo
-- NULL | Charlie
您需要使用 OPENJSON()
和默认架构来获取每个数组项的键(作为您的第一次尝试)。文档中的注释 explains:
Note: The Key, Value, and Type columns are returned only when you use
OPENJSON with the default schema and are not available with an
explicit schema.
以下语句只是另一种获取密钥并使用显式模式解析 JSON 的选项:
DECLARE @json NVARCHAR(MAX) = '[{"name":"Alpha"},{"name":"Bravo"},{"name":"Charlie"}]';
SELECT j1.[key], j2.*
FROM OPENJSON(@json) j1
CROSS APPLY OPENJSON (j1.[value]) WITH (name nvarchar(max)) j2
结果:
key name
---------
0 Alpha
1 Bravo
2 Charlie
我想在我的 sql-server 中解析一个 json-array。我想使用 OPENJSON
和 WITH
将特定值解析为列。如何获取每个数组项的索引?
我知道,这适用于 JSON_VALUE
和没有 WITH
:
DECLARE @json NVARCHAR(MAX) = '[{"name":"Alpha"},{"name":"Bravo"},{"name":"Charlie"}]'
SELECT [key], JSON_VALUE(value, '$.name')
FROM OPENJSON(@json)
-- key | value
----------------------------------
-- 0 | Alpha
-- 1 | Bravo
-- 2 | Charlie
但是当我添加 WITH
时,我似乎无法再访问 key
。
SELECT [key], name
FROM OPENJSON(@json)
WITH (
[key] INT, -- does not work
name NVARCHAR(MAX)
)
-- key | name
----------------------------------
-- NULL | Alpha
-- NULL | Bravo
-- NULL | Charlie
您需要使用 OPENJSON()
和默认架构来获取每个数组项的键(作为您的第一次尝试)。文档中的注释 explains:
Note: The Key, Value, and Type columns are returned only when you use OPENJSON with the default schema and are not available with an explicit schema.
以下语句只是另一种获取密钥并使用显式模式解析 JSON 的选项:
DECLARE @json NVARCHAR(MAX) = '[{"name":"Alpha"},{"name":"Bravo"},{"name":"Charlie"}]';
SELECT j1.[key], j2.*
FROM OPENJSON(@json) j1
CROSS APPLY OPENJSON (j1.[value]) WITH (name nvarchar(max)) j2
结果:
key name
---------
0 Alpha
1 Bravo
2 Charlie