如果列中存在数据,如何将列名映射到查询响应中?

Posted

技术标签:

【中文标题】如果列中存在数据,如何将列名映射到查询响应中?【英文标题】:How to map column name into query response if there is data present in column? 【发布时间】:2021-12-15 14:48:13 【问题描述】:

假设我有这样的表格,其中列数未知。我想知道是否有办法将env struct 属性映射到列中。

ID | env.foo | env.bar | .... | unknown number of env. columns | .... | env.xyz |
1  | prod    | null    | null | null                           | null | null    |
2  | prod    | prod    | null | null                           | null | null    |
3  | null    | null    | null | null                           | null | prod    |

我希望这张表的输出是这样的

ID | env 
1  | foo 
2  | foo 
2  | bar 
3  | xyz

【问题讨论】:

【参考方案1】:

考虑以下方法

select id, key as env
from your_table t, unnest([struct(to_json_string(env) as kv)]),
unnest(`bqutil.fn.json_extract_keys`(kv)) key with offset 
join unnest(`bqutil.fn.json_extract_values`(kv)) value with offset 
using (offset)
where not value is null       

如果应用于您的问题中的示例数据

with your_table as (
  select 1 id, struct<foo string, bar string, abc string, xyz string>
    ('prod', null, null, null) as env union all
  select 2, ('prod', 'prod', null, null) as env union all
  select 3, (null, null, null, 'prod') as env 
)              

输出是

【讨论】:

以上是关于如果列中存在数据,如何将列名映射到查询响应中?的主要内容,如果未能解决你的问题,请参考以下文章

Azure Synapse 映射数据流 - 派生列中列名的动态映射

Django Rest Framework - 将序列化器字段映射到数据库列名

如何将响应 API 中的数组映射到响应中的选择元素?

如何检查以下响应中是不是存在数据密钥?

访问中的编号列导致查询停止响应

如何根据响应状态代码将 ktor 响应映射到对象