sql - 从 SQL Server 中的 JSON 文本中提取值

标签 sql json sql-server

{"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/

相关文章:

mysql - 左连接的 SQL 替代方案

sql - 从结果集中消除部分重复行

python - 使用 openweathermap api 解析字典(json)中的数据

mysql - rails : returning the latest data of fields

mysql - 同时更新多个表

asp.net-mvc - 如何使用 Razor 将未编码的 Json 写入我的 View ?

Android facebook 登录小部件 : org. json.JSONException

sql-server - "System.AccessViolationException: Attempted to read or write protected memory"填充数据表时

c# - EF LINQ 空间查询在 SQL Server 中使用 Contains() 方法超时

c# - 有什么有效的解决方案/方法吗?