使用一个只有两列的表的简单示例 - 一个id和一个长JSON字符串 - 如何使用属性作为列轻松返回所有JSON值和属性?
我知道我可以随时使用JSON_VALUE
并指定一个特定的键/属性,但我不想为每个可能的键都有很多JSON_VALUE
列表。有这种动态的方式吗?
比方说,我有100个JSON密钥,结果应该是一个id列,另有100个密钥列及其值?
谢谢。
如果您的JSON对象只是键级值对的一级列表,则可以调用OPENJSON
:
DECLARE @mockup TABLE(Id INT, SomeJSON NVARCHAR(MAX));
INSERT INTO @mockup VALUES
(1,N'{"key1":"value1","key2":"value2"}')
,(2,N'{"key1":"value1","key5":"value5"}')
,(3,N'{"keyA":"valueA","keyB":"valueB","keyZ":"valueZ"}');
SELECT t.Id
,A.*
FROM @mockup t
CROSS APPLY OPENJSON(t.SomeJSON) A;
结果
1 key1 value1 1
1 key2 value2 1
2 key1 value1 1
2 key5 value5 1
3 keyA valueA 1
3 keyB valueB 1
3 keyZ valueZ 1
要以表格格式并排获取,您可以使用PIVOT
,条件聚合或 - 可能是最好的 - WITH
子句:
SELECT t.Id
,A.*
FROM @mockup t
CROSS APPLY OPENJSON(t.SomeJSON)
WITH(key1 NVARCHAR(10)
,key2 NVARCHAR(10)
,key5 NVARCHAR(10)
,keyA NVARCHAR(10)
,keyB NVARCHAR(10)
,keyZ NVARCHAR(10)
) A;
结果
Id key1 key2 key5 keyA keyB keyZ
1 value1 value2 NULL NULL NULL NULL
2 value1 NULL value5 NULL NULL NULL
3 NULL NULL NULL valueA valueB valueZ
在任何情况下,您必须提前知道所有可能的密钥。此方法允许最佳命名,您可以指定适当的类型。
如果您事先不知道所有密钥,可以查看动态SQL。您可以使用上面的语句来读取所有键并动态创建拟合语句/ WITH子句。