sql - 有没有办法从 SQL 中的 map(varchar, varchar) 列中提取数据?

标签 sql presto

数据存储为 map(varchar, varchar),如下所示:

Date           Info                                                  ID
2020-06-10     {"Price":"102.45", "Time":"09:31", "Symbol":"AAPL"}   10
2020-06-10     {"Price":"10.28", "Time":"12:31", "Symbol":"MSFT"}    10
2020-06-11     {"Price":"12.45", "Time":"09:48", "Symbol":"T"}       10

有没有办法拆分信息列并返回一个表,其中每个条目都有自己的列? 像这样:

Date          Price        Time       Symbol       ID
2020-06-10   102.45       09:31         AAPL       10
2020-06-10    10.28       12:31         MSFT       10

请注意,时间列可能不会出现在每个条目中。例如,条目可以如下所示:

Date           Info                                  ID
2020-06-10     {"Price":"10.28", "Symbol":"MSFT"}    10

在这种情况下,我希望它只用一个 nan 值填充它

谢谢

最佳答案

您可以使用 subscript operator ([])element_at函数访问 map 中的值。两者之间的区别在于,如果映射中缺少键,[] 将失败并报错。

WITH data(dt, info, id) AS (VALUES
    (DATE '2020-06-10',  map_from_entries(ARRAY[('Price', '102.45'), ('Time', '09:31'), ('Symbol','AAPL')]), 10),
    (DATE '2020-06-10',  map_from_entries(ARRAY[('Price', '10.28'), ('Time', '12:31'), ('Symbol','MSFT')]), 10),
    (DATE '2020-06-11',  map_from_entries(ARRAY[('Price', '12.45'), ('Time', '09:48'), ('Symbol','T')]), 10),
    (DATE '2020-06-12',  map_from_entries(ARRAY[('Price', '20.99'), ('Symbol','X')]), 10))

SELECT 
   dt AS "date", 
   element_at(info, 'Price') AS price, 
   element_at(info, 'Time') AS time, 
   element_at(info, 'Symbol') AS symbol, 
   id
FROM data
    date    | price  | time  | symbol | id
------------+--------+-------+--------+----
 2020-06-10 | 102.45 | 09:31 | AAPL   | 10
 2020-06-10 | 10.28  | 12:31 | MSFT   | 10
 2020-06-11 | 12.45  | 09:48 | T      | 10
 2020-06-12 | 20.99  | NULL  | X      | 10

关于sql - 有没有办法从 SQL 中的 map(varchar, varchar) 列中提取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63342651/

相关文章:

c# - 如何编写 Nhibernate 查询

sql - 如何根据前一行创建列?

sql - 如何将 ElasticSearch 查询传递给 hadoop

amazon-web-services - Amazon Athena View 实际上是 hive View ,还是单独的附加 View ?

presto - 在 Athena/presto 中取消嵌套映射值作为单独的列

sql - 按照LINK中的代码后PL/SQL MENU疑惑

mysql - 如何让用户今天过生日?

python - 将 Python NumPy 数组插入 PostgreSQL 数据库的最佳方法

php - 如何在 laravel 中使用 sql NOW( ) 函数

Presto:如何使用当前日期和时区指定时间间隔