使用 SQL presto 将类似 dict 的 varchar 列拆分为多个列

问题描述 投票:0回答:1

我的表中有一个列是 varchar 但具有类似字典的格式。有些行有更多的键值对(例如第一行有 3 对,第二行有 4 对)。 例如:

专栏
{"customerid":"12345","name":"约翰", "likes":"足球、跑步"}
{"customerid":"54321","name":"Sam", "喜欢":"艺术", "不喜欢":"徒步旅行"}

我需要一个可以“分解”列的查询,如下所示:

客户ID 名字 喜欢 不喜欢
12345 约翰 足球、跑步
54321 山姆 艺术 徒步旅行

不添加额外的行。只是额外的列(表中还有其他已经存在的列)。

我尝试将 varchar 列转换为数组,然后使用 UNNEST 函数,但它不起作用。我认为该方法会创建额外的行。

我正在使用 Prestosql。

sql presto trino
1个回答
3
投票

你的数据看起来像json,所以你可以解析和处理它:

-- sample data
WITH dataset (column) AS (
    VALUES ('{"customerid":"12345","name":"John", "likes":"Football, Running"}' ),
        ('{"customerid":"54321","name":"Sam", "likes":"Art", "dislikes":"Hiking"}')
) 

--query
select json_extract_scalar(json_parse(column), '$.customerid') customerid,
    json_extract_scalar(json_parse(column), '$.name') name,
    json_extract_scalar(json_parse(column), '$.likes') likes,
    json_extract_scalar(json_parse(column), '$.dislikes') dislikes
from dataset

输出:

客户ID 名字 喜欢 不喜欢
12345 约翰 足球、跑步
54321 山姆 艺术 徒步旅行

如果有很多列,您可以通过转换为解析的 json 来映射来美化它(取决于内容,它可以是

map(varchar, varchar)
map(varchar, json)
):

--query
select m['customerid'] customerid,
    m['name'] name,
    m['likes'] likes,
    m['dislikes'] dislikes
from (
    select cast(json_parse(column) as map(varchar, varchar)) m
    from dataset
)
© www.soinside.com 2019 - 2024. All rights reserved.