首页 > 解决方案 > 在 SQL 中提取嵌套的 JSON 字段

问题描述

我正在尝试编写一个 sql 查询(在 Presto 中)以提取详细信息字段中的可读文本无法获得正确的路径

 {
      "2177f7f1-0d36-4663-b190-b686ab2d9031":{
         "button_name":"No Issue",
         "details":{
            "2abe85b0-5dee-49be-809f-448444af55c4":"No Issue Due to XYZ"
         }
      },
      "b2a6aba8-abe4-4ded-928f-af96eee675ef":{
         "button_name":"No Issue",
         "details":{
            "b40382f7-bf8a-477a-9f38-126d7d0016c4":"Double Blind Confirmed"
         }
      }
   }

这是我尝试过但不起作用的方法 SELECT json_extract_scalar(content, '$.details') FROM table

标签: sqljsonpresto

解决方案


假设示例 json 是content列中的示例,您可以使用 presto 将 json 转换为MAP并执行以下操作的功能:

WITH dataset (json_str) AS (
    VALUES (JSON ' {
      "2177f7f1-0d36-4663-b190-b686ab2d9031":{
         "button_name":"No Issue",
         "details":{
            "2abe85b0-5dee-49be-809f-448444af55c4":"No Issue Due to XYZ"
         }
      },
      "b2a6aba8-abe4-4ded-928f-af96eee675ef":{
         "button_name":"No Issue",
         "details":{
            "b40382f7-bf8a-477a-9f38-126d7d0016c4":"Double Blind Confirmed"
         }
      }
   }')
)

SELECT flatten(
        transform(
            map_values(cast(json_str as MAP(VARCHAR, JSON))),
            j -> map_values(
                     cast(json_extract(j, '$.details') as MAP(VARCHAR, VARCHAR))
            )
        )
    )
FROM dataset

这将产生下一个输出:

_col0
[由于XYZ没有问题,双盲确认]

推荐阅读