在 BigQuery 中使用动态键使用 JSON

问题描述 投票:0回答:1

我在 BigQuery 中有一个名为 json_response 的 json 字段。它有这样的形状:

{
    "2024-11-24": {
        "fatturato": {
            "numero": 281,
            "totale": 44444.72,
            "paesi": {
                "ITA": {
                    "num": 84,
                    "val": 33333.38
                },
                "USA": {
                    "num": 60,
                    "val": 20222.14
                }
            }
        },
        "ordini": {
            "totale": 5555.67,
            "num": 7,
            "paesi": {
                "ITA": {
                    "num": 14,
                    "val": 55.7
                },
                "USA": {
                    "num": 16,
                    "val": 222.5
                }
            }
        }
    },
    "2024-11-25": {
        "fatturato": {
            "numero": 225,
            "totale": 33333.72,
            "paesi": {
                "ITA": {
                    "num": 25,
                    "val": 22222.38
                },
                "USA": {
                    "num": 60,
                    "val": 20222.14
                }
            }
        },
        "ordini": {
            "totale": 5555.67,
            "num": 7,
            "paesi": {
                "ITA": {
                    "num": 14,
                    "val": 55.7
                },
                "USA": {
                    "num": 16,
                    "val": 222.5
                }
            }
        }
    },
}

我想查询它以获得一个名为 ref_date 的列(键中包含日期,可以有很多),列“paesi”,列“fatturato_numero”,“fatturato_valore”等,忽略总数。在这种情况下,我将有两行,一行代表“2024-11-24”,另一行代表““2024-11-25”。

我尝试使用 JSON_EXTRACT,但它说键必须是常量,而不是动态的。

sql json google-bigquery
1个回答
0
投票

您可以使用

JSON_KEYS
函数从 JSON 中获取所有键,然后访问它们各自的值:

SELECT 
    ref_date,
    json_column[ref_date].fatturato.paesi as paesi,
    json_column[ref_date].fatturato.numero as fatturato_numero
FROM sample, UNNEST(JSON_KEYS(sample.json_column, 1)) as ref_date

输出: Output of the query

© www.soinside.com 2019 - 2024. All rights reserved.