【发布时间】:2021-06-25 22:58:40
【问题描述】:
这是原始的 JSON 结构:
{
"tt": [{
"box": {
"type": "A"
},
"rr": {...}
}, {
"box": {
"type": "B"
},
"rr": {...}
}, {
"box": {
"type": "C"
},
"rr": {...}
}]
}
然后我使用下面的SQL命令得到tt结构
with t1 as (
SELECT
rate_card,
JSON_EXTRACT_ARRAY(rate_card, '$.tt') as rr,
FROM `original_table_temp`
)
上一个 JSON 结构中的 rr JSON 结构如下所示
{
"rr": {
"10": { <-------------------------
"tils": {
"mdd": {
"df": {
"tif": {
"sc": 17.85, <------------------
"evr": [
{
"p": 16.35, <---------------------
"t": null,
"nr?": false
}
]
}
}
},
"11": {...},
"12": {...},
...
}
}
以上所有 SQL 命令都在 BigQuery 中执行。
我有兴趣将box.type、rr 的keys(即rr 中的10、11、12 等)放入一列。
keys 旁边的列是sc 和p
最终表格的输出如下:
+------------+---------+---------------+
| box.type| rr | sc | p |
+------------+-------------------------+
| A | 10 | 17.85 | 16.35 |
| A | 11 |some value| .... |
......
| C | 12 | ..... | ......|
+------------+----------------------------+
目前,我设法通过 SQL BigQuery 中的硬编码获得了 sc 值。见下文:
SELECT
JSON_EXTRACT_SCALAR(rr_2, '$.rr.10.tils.mdd.df.tif.sc') AS sc,
FROM t1,
UNNEST(rr) rr_2
上面的方法效率不高,因为keys很多,比如10、11、12等等。
- 如何将动态
keys从rr提取到列中? - 如何不对 SQL 进行硬编码以获取
sc和p?
在测试答案时,请随意删除 JSON 示例中的 <----------。
这是一篇很长的文章。如果您需要更多信息,请告诉我。
感谢您的耐心和时间。
【问题讨论】:
-
您不“硬编码”的想法是尝试在嵌套结构中动态查找字段
sc和p? -
which is taken from a JSON array column- 我建议您使用该数组显示原始 json - 因此我们可以更轻松地帮助您 - 而且我希望如果我们从该数组开始,它将只是超级简单的解决方案 -
@Isac,是的,你是对的。我想动态获取
sc,p,而不需要写'$.rr.10.tils.mdd.df.tif.sc' -
@MikhailBerlyant,我已经编辑了原始问题以包含原始 JSON 结构。如果您需要更多信息,请告诉我。
标签: sql json google-bigquery unnest