Допустим, у меня есть вариантное поле с несколькими ключами, и я не знаю, какой ключ даст мне значение, которое меня волнует, пока я не выполню запрос к таблице метаданных. Вот упрощенный и надуманный пример:
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
Есть ли более простой подход?