我有我的桌子:
事件名称 | 价值 |
---|---|
事件1 | {“link_id”:“耳机”,“规格”:“dtx”} |
事件2 | {“geo”:“22.12.11”} |
我需要解析单独列中的每个键,如下所示:
事件名称 | link_id | 规格 | 地理 |
---|---|---|---|
事件1 | 耳机 | dtx | |
事件2 | 22.12.11 |
我知道解决方案:
WITH my_table (event_name, value) AS (
values
('event1','{"link_id":"headphones","spec":"dtx"}'),
('event2','{"geo":"22.12.11"}')
)
SELECT
event_name,
json_extract(value, '$.link_id') as link_id,
json_extract(value, '$.spec') as spec,
json_extract(value, '$.geo') as geo
FROM my_table;
但是我可以在不指定每个参数的情况下这样做吗?我有大约。 100 个参数。
但是我可以在不指定每个参数的情况下这样做吗?我有大约。 100 个参数。
简而言之 - 不,如果您希望它们作为单独的列,则不能。可能更惯用(并且可能适合您)的 SQL 方法是将它们解析为单独的键值行:
WITH my_table (event_name, value) AS (
values
('event1','{"link_id":"headphones","spec":"dtx"}'),
('event2','{"geo":"22.12.11"}')
)
SELECT event_name,
key,
val
FROM my_table,
unnest(cast(json_parse(value) as map(varchar, json))) as t(key, val);
输出:
事件名称 | 钥匙 | val |
---|---|---|
事件1 | link_id | 耳机 |
事件1 | 规格 | dtx |
事件2 | 地理 | 22.12.11 |
附言
您的目标需要动态 SQL 生成(例如使用一些“外部”脚本)或 Presto/Trino ATM 不支持的动态数据透视。