繁体   English   中英

如何向 json 文件添加“根元素”

[英]How do I add a 'root element' to a json file

我做了一个 SQL 查询(使用 CTE 构建),结果是 6 个产品及其属性。 查询只是select * from output结果如下表,列数多于下表:

|row | gender | prod_1| url_1 | prod_2 |  url_2| ...
|  1 |  male  |   nike| www.xy|  adidas| www.ap| ...
|  2 | female |   puma| www.zq|   apple| www.ad| ...

当此表转换为 JSON 时,它看起来像这样:

[{
  "gender": "male",
  "product_1": "nike",
  "url_1": "www.xy ",
  "product_2": "puma",
  ...,
  "gender": "female",
  "product_1": "adidas",
  "url_1": "www.xy ",
  "product_2": "apple",
  ...,
}]

但是,我想按性别对结果进行分组,并使结果如下所示:

{
   "male": {
       "product_1": "nike",
       "url_1": "www.xy",
       "product_2": "adidas",
       ...,
   }
   "female": {
       "product_1": "puma",
       "url_1": "www.zq",
       "product_2": "apple",
       ...,
   }
}

所有不同的产品(+属性)都属于两个根元素。 有谁知道这个结果是否以及如何可能(通过查询?)。

我的 output 现在看起来像这样: 在此处输入图像描述

但我希望 output 看起来像这样: 在此处输入图像描述

由于 JSON object 的键应该是 Bigquery 中的列名,因此简单的解决方法是使用STRUCT ,如下所示:

WITH sample_table AS (
  SELECT 'male' gender, 'nike' product_1, 'www.xy' url_1, 'puma' product_2, 'www.xyz' url_2
   UNION ALL
  SELECT 'female' gender, 'adidas' product_1, 'www.xy' url_1, 'apple' product_2, 'www.xyz' url_2
)
SELECT CASE gender
         WHEN 'male' THEN TO_JSON_STRING(STRUCT((SELECT AS STRUCT t.* EXCEPT(gender)) AS male))
         WHEN 'female' THEN TO_JSON_STRING(STRUCT((SELECT AS STRUCT t.* EXCEPT(gender)) AS female))
       END AS json
  FROM sample_table t;

在此处输入图像描述

更新

SELECT CASE gender -- actually this CASE is not necessary cause it generates same output without it
         WHEN 'male' THEN (SELECT AS STRUCT t.* EXCEPT(gender))
         WHEN 'female' THEN (SELECT AS STRUCT t.* EXCEPT(gender))
       END AS items
  FROM sample_table t;

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM