wat*_*sts 0 sql snowflake-cloud-data-platform
假设我有一个带有多个键的变体字段,在查询元数据表之前,我不知道哪个键会给我我关心的值。这是一个简化和人为的示例:
create table KEY_LOOKUP (
key_name text,
is_useful boolean
);
insert into KEY_LOOKUP values
('A', True),
('B', False);
create table DATA (
key_values variant
);
insert into DATA
select PARSE_JSON('{"A": "Useful Value", "B": "Useless Value"}');
Run Code Online (Sandbox Code Playgroud)
该DATA表现在包含两个键,其中一个会给我我想要的值,而其中一个没有用。如果我事先知道这A是我需要的密钥,我可以简单地select key_values:A,但如果我事先不知道,我必须先查询KEY_LOOKUP。
如果我想编写一个始终使用适当键的查询,我可以展平表并像这样提取相关值:
select b.value from DATA a, lateral flatten(input => a.key_values) b
where b.key in
(select key_name from KEY_LOOKUP
where is_useful);
Run Code Online (Sandbox Code Playgroud)
但这有几个缺点。它很慢,语法冗长且(对我而言)不直观,并且在表展平后处理聚合很尴尬,尤其是当我为多个键执行此操作时。
理想情况下,我很想写这样的东西:
select key_values:{select key_name from KEY_LOOKUP where is_useful}
from DATA
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法?
实际上,可以编写与您梦想中的查询非常相似的 SQL 语句:
select GET(key_values, (select key_name::VARCHAR from KEY_LOOKUP
where is_useful)) from DATA;
Run Code Online (Sandbox Code Playgroud)
爱雪花的另一个原因:)