繁体   English   中英

如何将键值数组转换为 BigQuery/GoogleSQL 中的列?

[英]How to convert an array of key values to columns in BigQuery / GoogleSQL?

我在 BigQuery 中有一个如下所示的数组:

SELECT params FROM mySource;

[
  {
    key: "name",
    value: "apple"
  },{
    key: "color",
    value: "red"
  },{
    key: "delicious",
    value: "yes"
  }
]

看起来像这样:

参数
[{ key: "name", value: "apple" },{ key: "color", value: "red" },{ key: "delicious", value: "yes" }]

如何更改我的查询,使表看起来像这样:

姓名 颜色 美味的
苹果 红色的 是的

目前我能够通过以下方式完成此任务:

SELECT 
         (
           SELECT p.value
           FROM UNNEST(params) AS p
           WHERE p.key = "name"
         ) as name,
         (
           SELECT p.value
           FROM UNNEST(params) AS p
           WHERE p.key = "color"
         ) as color,
         (
           SELECT p.value
           FROM UNNEST(params) AS p
           WHERE p.key = "delicious"
         ) as delicious,
FROM mySource;

但我想知道是否有一种方法可以在手动指定每个键名的情况下做到这一点。 我们可能无法提前知道所有键的名称。

谢谢!

考虑以下方法

select * except(id) from (
  select to_json_string(t) id, param.* 
  from mySource t, unnest(parameters) param
)
pivot (min(value) for key in ('name', 'color', 'delicious'))    

如果应用于您问题中的样本数据 - 输出如下

在此处输入图片说明

如您所见 - 您仍然需要指定键名,但整个查询更简单且更易于管理

同时,上面的查询可以通过使用 EXECUTE IMMEDIATE 来增强,其中键名列表是自动生成的。 我对这种技术至少有几个答案,所以如果你愿意,可以在 SO 上搜索它(我只是不想在这里复制)

这是基于我试穿米哈伊尔的答案在这里

--DDL for sample view 

create or replace view sample.sampleview
as

with _data
as
(
    select 1 as id,
    array (
        select struct(
            "name" as key,
            "apple" as value
        ) 
        union all
        select struct(
            "color" as key,
            "red" as value
        )
        union all 
        select struct(
            "delicious" as key,
            "yes" as value
        )
    ) as _arr  
    union all 
    select 2 as id,
    array (
            select struct(
                "name" as key,
                "orange" as value
            ) 
            union all
            select struct(
                "color" as key,
                "orange" as value
            )
            union all 
            select struct(
                "delicious" as key,
                "yes" as value
            )
    )
     
    
)
select * from _data

立即执行

declare sql string;

set sql = 
            (
                select 
                    concat(
                            "select id,",
                            string_agg(
                                concat("max(if (key = '",key,"',value,NULL)) as ",key)
                            ),
                            ' from sample.sampleview,unnest(_arr) group by id'
                    )
                from (
                    select key from
                    sample.sampleview,unnest(_arr)
                    group by key
                    )
                
            );
execute immediate   sql;


暂无
暂无

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

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