从JSON“对象”提取SQL

时间:2019-04-01 10:53:56

标签: sql json sql-server

因此,我需要从JSON存储中提取一些数据,并且大多数情况下,使用JSONVALUE()非常简单,但是有些存储似乎使用了更深的存储方法。

一些示例代码;

DECLARE @json NVARCHAR(MAX) = '{
"N.data.-60d8249a-ed12-4f41-98f4-01c910c6b2f4": null,
"R.title": "{\"description\":\"Mr\",\"alternates\":{},\"position\":0}",
"R.gender": "{\"description\":\"Male\",\"alternates\":{},\"position\":1}",
"R.jobTitle": "{\"description\":\"Operations\",\"alternates\":{},\"position\":2}"
}'

我需要做的是从每个键中提取“描述”方面。例如,“ R.title”会给我“ Mr”等。

理想情况下,我每次都可以使用参数方法提取特定的键;

DECLARE @id nvarchar(200) = 'R.title'
SELECT  
*  
FROM OPENJSON(@json, concat('$."',@id,'"')) AS a

有没有不执行讨厌的substring()方法的正确方法?

谢谢!

使用;

Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64)   Aug 22 2017 17:04:49   Copyright (C) 2017 Microsoft Corporation  Express Edition (64-bit) on Windows Server 2012 R2 Datacenter 6.3 <X64> (Build 9600: ) (Hypervisor) 

1 个答案:

答案 0 :(得分:0)

这可能是一个较晚的答案,但我希望它会有所帮助。您需要使用两个OPENJSON()调用和附加的APPLY运算符来解析输入的JSON。第一个OPENJSON()调用使用默认模式来获取输入JSON中所有键的名称。

声明:

DECLARE @json NVARCHAR(MAX) = '{
"N.data.-60d8249a-ed12-4f41-98f4-01c910c6b2f4": null,
"R.title": "{\"description\":\"Mr\",\"alternates\":{},\"position\":0}",
"R.gender": "{\"description\":\"Male\",\"alternates\":{},\"position\":1}",
"R.jobTitle": "{\"description\":\"Operations\",\"alternates\":{},\"position\":2}"
}'


SELECT j.[key], v.description
FROM OPENJSON(@json) j
CROSS APPLY OPENJSON(j.[value]) WITH (description nvarchar(max) '$.description') v

结果:

-----------------------  
key         description
-----------------------  
R.title     Mr
R.gender    Male
R.jobTitle  Operations