数据存储为 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/