如果列中存在数据,如何将列名映射到查询响应中?
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 映射数据流 - 派生列中列名的动态映射