Можно ли динамически выбирать вариант ключа, используя подзапрос, без выравнивания таблицы? - PullRequest
0 голосов
/ 01 мая 2020

Допустим, у меня есть вариантное поле с несколькими ключами, и я не знаю, какой ключ даст мне значение, которое меня волнует, пока я не выполню запрос к таблице метаданных. Вот упрощенный и надуманный пример:

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

Есть ли более простой подход?

1 Ответ

5 голосов
/ 02 мая 2020

На самом деле, можно написать оператор SQL, очень похожий на запрос вашей мечты:

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

Еще одна причина любить Снежинку:)

...