{"A":100,
"B":[{"Title":"Age","Match":false},{"Title":"Height","Match":false},{"Title":"Country","Match":false},{"Title":"Gender","Match":false},{"Title":"Language","Match":True}],
"C":78}
我在 SQL Server 数据库中有一张表,其中一列 (columnName) 包含 JSON 文本。我想提取值并在单独的列中返回结果。
我尝试过:
SELECT JSON_VALUE(columnName, $.A) AS Score, -- This works --
JSON_VALUE(columnName, $.B.Title...) AS Age, -- How can I access the Age, Match values --
JSON_VALUE(columnName, $.C) AS FinalScore -- This works --
我认为对于 A 和 C 来说它是有效的,因为它们有一个值,但 B 有对象列表。
最佳答案
您需要如下所示的声明。您应该使用 OPENJSON()
和显式架构(列定义)解析输入 JSON:
表:
CREATE TABLE Data (JsonData varchar(1000))
INSERT INTO Data (JsonData)
VALUES ('{"A":100,
"B":[{"Title":"Age","Match":false},{"Title":"Height","Match":false},{"Title":"Country","Match":false},{"Title":"Gender","Match":false},{"Title":"Language","Match":true}],
"C":78}')
声明:
SELECT j1.A, j1.C, j2.*
FROM Data d
CROSS APPLY OPENJSON (d.JsonData) WITH (
A int '$.A',
B nvarchar(max) '$.B' AS JSON,
C int '$.C'
) j1
CROSS APPLY OPENJSON (j1.B) WITH (
Title varchar(500) '$.Title',
Match bit '$.Match'
) j2
结果:
A C Title Match
100 78 Age False
100 78 Height False
100 78 Country False
100 78 Gender False
100 78 Language True
请注意,NULL
结果的原因是输入 JSON 中的 B
键是 JSON 数组,因此您需要使用 JSON_QUERY()
获取整个 JSON 数组,并使用额外的 CROSS APPLY
来解析该数组。 JSON_VALUE()
从 JSON
字符串中提取标量值,如果 path
指向的不是标量值,则结果为 NULL
在 lax
模式下,在 strict
模式下出错。
SELECT
JSON_VALUE(d.JsonData, '$.A') AS A,
JSON_QUERY(d.JsonData, '$.B') AS B,
JSON_VALUE(d.JsonData, '$.C') AS C,
j.*
FROM Data d
CROSS APPLY OPENJSON(d.JsonData, '$.B') WITH (
Title varchar(500) '$.Title',
Match bit '$.Match'
) j
关于sql - 从 SQL Server 中的 JSON 文本中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61258381/