sql - 我可以使用子查询动态选择变体键,而无需展平表吗?
问题描述
假设我有一个带有多个键的变量字段,并且在查询元数据表之前,我不知道哪个键会给我我关心的值。这是一个简化且人为的示例:
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
有没有更简单的方法?
解决方案
实际上,可以编写与您的梦想查询非常相似的 SQL 语句:
select GET(key_values, (select key_name::VARCHAR from KEY_LOOKUP
where is_useful)) from DATA;
爱雪花的另一个原因:)
推荐阅读
- jquery - 初始化datadatable后无法对click事件进行ajax调用
- ios - NativeScript iOS 警报对话框按钮颜色
- java - 我是springboot的新手,试图了解下面的休眠映射是我的代码
- python - 从 Python 中的字典键、值创建共现矩阵
- java - Eclipse 插件中的 com.google.protobuf.ExtensionRegistryLite ClassNotFoundException
- c++14 - 无法在 c++14 中比较点和整数
- azure - 如何获取有关我的模板无法启动的信息?
- node.js - Node.js - mongoose model.save() 没有将数据保存到我的集合中
- java - 使用 H2 进行 Spring Data Jpa 测试并从 MSSQL Server 恢复备份
- pandas - df.columns 未列出的所有列名