2

属性の内部配列を持つ json ドキュメントがあります。これらの属性の 1 つで、キー名が動的またはランダムに変化します。この最後のやっかいな属性を除いて、すべてのデータ ポイントを簡単に抽出できます。過去に OPENJSON で見つけた、または使用したすべてのメソッドは、既知のキー名に依存していました。

「内側」の配列内では、最初の属性のキー名が変更されます。そのキーが何であるかを正確に知らなくても、その動的キーに関連付けられた値を抽出したいと考えています。以下のコードが、私が言葉で説明するよりも問題をよく説明してくれることを願っています。

読みやすいようにフォーマットされた JSON ドキュメントは次のようになります...

{
    "outer1": {
        "inner1": {
            "dynamicKey123": "attribute1",
            "staticKey1": "attribute2",
            "staticKey2": "attribute3",
            "staticKey3": "attribute4"
        }
    },
    "outer2": {
        "inner2": {
            "dynamicKeyABC": "attribute1",
            "staticKey1": "attribute2",
            "staticKey2": "attribute3",
            "staticKey3": "attribute4"
        }
    }
}

テストするコード...

CREATE TABLE openjson_test (json_col VARCHAR(MAX));

INSERT INTO openjson_test (json_col)
VALUES ('{"outer1":{"inner1":{"dynamicKey123":"attribute1","staticKey1":"attribute2","staticKey2":"attribute3","staticKey3":"attribute4"}},"outer2":{"inner2":{"dynamicKeyABC":"attribute1","staticKey1":"attribute2","staticKey2":"attribute3","staticKey3":"attribute4"}}}');

これまでに開発したクエリで面倒な部分をコメントアウトして...

SELECT
    json_col,
    so.[key] AS soKey,
    si.[key] AS siKey,
    si.[value] AS siValue,
    --ar.dynamicKey, 
    ar.staticKey1,
    ar.staticKey2,
    ar.staticKey3
FROM openjson_test
CROSS APPLY OPENJSON(json_col) so
CROSS APPLY OPENJSON(json_col, '$.' + so.[key]) si
CROSS APPLY OPENJSON(json_col, '$.' + so.[key] + '.' + si.[key])
WITH (
    --dynamicKey VARCHAR(256) '$.dynamicKey???', How do I extract this value without knowing the key
    staticKey1 VARCHAR(256) '$.staticKey1',
    staticKey2 VARCHAR(256) '$.staticKey2',
    staticKey3 VARCHAR(256) '$.staticKey3'
) ar
4

2 に答える 2