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

splitting a dict-like varchar column into multiple columns using SQL presto

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

column
{"customerid":"12345","name":"John", "likes":"Football, Running"}
{"customerid":"54321","name":"Sam", "likes":"Art", "dislikes":"Hiking"}

我需要一个可以像这样“分解”列的查询:

customerid name likes dislikes
12345 John Football, Running
54321 Sam Art Hiking

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

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

我正在使用 Prestosql。

您的数据看起来像 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

输出:

customerid name likes dislikes
12345 John Football, Running
54321 Sam Art Hiking

如果有很多列,您可以通过转换为已解析的 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
)