我的表中有一个列是 varchar 但具有类似字典的格式。有些行有更多的键值对(例如第一行有 3 对,第二行有 4 对)。 例如:
专栏 |
---|
{"customerid":"12345","name":"约翰", "likes":"足球、跑步"} |
{"customerid":"54321","name":"Sam", "喜欢":"艺术", "不喜欢":"徒步旅行"} |
我需要一个可以“分解”列的查询,如下所示:
客户ID | 名字 | 喜欢 | 不喜欢 |
---|---|---|---|
12345 | 约翰 | 足球、跑步 | |
54321 | 山姆 | 艺术 | 徒步旅行 |
不添加额外的行。只是额外的列(表中还有其他已经存在的列)。
我尝试将 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
输出:
客户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
)