首页 > 解决方案 > 我可以使用子查询动态选择变体键,而无需展平表吗?

问题描述

假设我有一个带有多个键的变量字段,并且在查询元数据表之前,我不知道哪个键会给我我关心的值。这是一个简化且人为的示例:

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"}');

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);

但这有几个缺点。它很慢,语法冗长且(对我而言)不直观,并且在表展平后处理聚合很尴尬,特别是如果我对多个键执行此操作。

理想情况下,我很想写这样的东西:

select key_values:{select key_name from KEY_LOOKUP where is_useful}
from DATA

有没有更简单的方法?

标签: sqlsnowflake-cloud-data-platform

解决方案


实际上,可以编写与您的梦想查询非常相似的 SQL 语句:

select GET(key_values, (select key_name::VARCHAR from KEY_LOOKUP
where is_useful)) from DATA;

爱雪花的另一个原因:)


推荐阅读