我想将“住房”钥匙拆分到不同的行上。所以在这个例子中我预计有 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”实例。
有更好的方法吗?
谢谢
您正在取消超级数组的嵌套,AWS 文档描述了如何执行此操作:
https://docs.aws.amazon.com/redshift/latest/dg/query-super.html
这基本上将为数据顶部数组中的每个元素创建一个新行。然后您可以应用您想要提取的各个字段的选择 SQL。