-1

我通过 REST API 接收的 JSON 格式具有我无法加载到 OPENJSON 中的动态节点。JSON 响应来自第三方,我无法更改它。请参阅下面的示例并注意日期被用作节点:

{
    "Meta Data": {
        "1. Information": "API JSON",
        "2. TYPE": "JSON",
    },
    "TSD": {
        "2019-08-13": {
            "value1": "136.0500",
            "value2": "137.7400"
        },
        "2019-08-12": {
            "value1": "137.0700",
            "value2": "137.8600"

        },
        "2019-08-09": {
            "value1": "138.6100",
            "value2": "139.3800"
        }
    }
}

如果我知道使用以下代码的确切日期,则可以获取特定节点:

 SELECT [value1], [value2]
 FROM OPENJSON(@json, '$."TSD"."2019-08-13"')
 WITH (
    [value1] numeric(20,10),
    [value2] numeric(20,10),
    )

然而这并没有帮助,因为我不会提前知道日期,并且使用这种方法一次只能选择一个日期节点。

如何在不事先知道节点名称的情况下引用这些动态日期?

4

1 回答 1

3

你需要打OPENJSON()两次电话。第一次调用使用默认模式,结果是一个包含key,valuetype列的表(该key列包含日期)。第二个调用是带有定义列的显式模式。

请注意,您需要,"2. TYPE": "JSON".

JSON:

DECLARE @json nvarchar(max) = N'{
    "Meta Data": {
        "1. Information": "API JSON",
        "2. TYPE": "JSON"
    },
    "TSD": {
        "2019-08-13": {
            "value1": "136.0500",
            "value2": "137.7400"
        },
        "2019-08-12": {
            "value1": "137.0700",
            "value2": "137.8600"

        },
        "2019-08-09": {
            "value1": "138.6100",
            "value2": "139.3800"
        }
    }
}'

陈述:

SELECT 
   j1.[key] AS [Date],
   j2.value1,
   j2.value2
FROM OPENJSON(@json, '$.TSD') j1
CROSS APPLY OPENJSON(j1.[value])  WITH (
   value1 numeric(20, 4) '$.value1',
   value2 numeric(20, 4) '$.value2'
) j2

输出:

-------------------------------
Date        value1      value2
-------------------------------
2019-08-13  136.0500    137.7400
2019-08-12  137.0700    137.8600
2019-08-09  138.6100    139.380
于 2019-08-13T14:22:13.060 回答