Redshift 中的 JSON 字段

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

我想将“住房”钥匙拆分到不同的行上。所以在这个例子中我预计有 4 行。每行内都有以下列:

id(这是桌子上的键),housing.id,housing.name,user.id,hours,isplanningtime

JSON 示例。

[{"housing":{"id":"02d3ca45-36b3-4114-91b7-39ed12e1548b","name":"texting"},"user":{"id":"75bd4cad-acc9-420d-9d5e-4d2851a4b9c4","name":"person_person","jobTitle":"Sales Manager","avatar":null,"email":"[email protected]","disabled":false},"hours":4,"isPlanningTime":false},{"housing":{"id":"02d3ca45-36b3-4114-91b7-39ed12e1548b","name":"testing"},"user":null,"hours":4,"isPlanningTime":false},{"housing":{"id":"02d3ca45-36b3-4114-91b7-39ed12e1548b","name":"testing"},"user":null,"hours":4,"isPlanningTime":false},{"housing":{"id":"02d3ca45-36b3-4114-91b7-39ed12e1548b","name":"testing"},"user":null,"hours":4,"isPlanningTime":false}]

我已经成功地使用以下代码做到了这一点


    SELECT cd.id,
           json_extract_path_text(json_extract_array_element_text(cd.value, 0), 'housing', 'id') AS housing_id_0,
           json_extract_path_text(json_extract_array_element_text(cd.value, 0), 'housing', 'name') AS housing_name_0,
           json_extract_path_text(Json_extract_array_element_text(cd.value, 0), 'user', 'id') AS user_id_0,
           json_extract_path_text(json_extract_array_element_text(cd.value, 0), 'hours') AS hours_0,
           json_extract_path_text(json_extract_array_element_text(cd.value, 0), 'isPlanningTime') AS isPlanningTime_0
    FROM "data" cd
    LEFT JOIN "field" c ON c.id = cd.field_id
    WHERE c.name = 'time'

使用Union All,我复制了代码并进行了更改

    json_extract_array_element_text(cd.value, 1)
    json_extract_array_element_text(cd.value, 2)

等等。

问题是 JSON 中可能有 100 多个“housing”实例。

有更好的方法吗?

谢谢

json amazon-redshift json-extract
1个回答
0
投票

您正在取消超级数组的嵌套,AWS 文档描述了如何执行此操作:

https://docs.aws.amazon.com/redshift/latest/dg/query-super.html

这基本上将为数据顶部数组中的每个元素创建一个新行。然后您可以应用您想要提取的各个字段的选择 SQL。

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