Sal*_*rik 2 sql json presto amazon-athena trino
我有一个表,其中存储了 Json 对象的一些信息:
桌子:
investment
unit(string)
data(string)
Run Code Online (Sandbox Code Playgroud)
如果运行查询SELECT * FROM "db"."investment" limit 10;我得到以下结果:
Unit Data
CH [{"from":"CH","when":"2021-02-16","who":"pp@gmail.com"}]
AB [{"from":"AB","when":"2020-02-16","who":"jj@gmail.com"}]
Run Code Online (Sandbox Code Playgroud)
现在,我运行以下基本查询以返回 Json 嵌套对象中的值:
SELECT json_extract_scalar(Data, '$[0].who') email FROM "db"."investment";
我得到了以下结果:
email
jj@gmail.com
pp@gmail.com
Run Code Online (Sandbox Code Playgroud)
如何使用WHERE子句过滤此查询以仅返回单个值:
我已经尝试过这个,但显然它不能像带有行和列的普通 SQL 表一样工作:
SELECT json_extract_scalar(Data, '$[0].who') email FROM "db"."investment" WHERE email = "pp@gmail.com";
有什么帮助吗?
你的问题似乎有一些错别字。
Date大概Unit Date应该是Datakey。也许你的意思是Data另请注意,athena 不区分大小写,并且列名称将转换为小写(即使您引用它们)。
解决这个问题后,您必须使用从子句中的 json 文档中提取电子邮件的完整表达式where。查询的其余部分无法访问定义的列别名。
这是一个独立的示例:
with test (unit, data) as (
values
('CH', JSON '[{"from":"CH","when":"2021-02-16","who":"pp@gmail.com"}]'),
('AB', JSON '[{"from":"AB","when":"2020-02-16","who":"jj@gmail.com"}]')
)
select json_extract_scalar(data, '$[0].who') email
from test
where json_extract_scalar(data, '$[0].who') = 'pp@gmail.com';
outputs:
| email |
+--------------+
| pp@gmail.com |
Run Code Online (Sandbox Code Playgroud)