因此,我需要从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)
答案 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