检查 Presto 值映射中是不是存在键

Posted

技术标签:

【中文标题】检查 Presto 值映射中是不是存在键【英文标题】:Checking if key exists in Presto value map检查 Presto 值映射中是否存在键 【发布时间】:2019-08-20 21:38:50 【问题描述】:

我是 Presto 的新手,不太清楚如何检查地图中是否存在密钥。当我运行SELECT 查询时,返回此错误消息:

Key not present in map: element

SELECT value_map['element'] FROM
mytable
WHERE name = 'foobar'

添加AND contains(value_map, 'element') 不起作用

数据类型为字符串数组

SELECT typeof('value_map') FROM mytable 

返回varchar(9)

如何只选择value_map 中存在“元素”的记录?

【问题讨论】:

如果列类型是varchar,那么它是一个字符串,而不是一个映射。你能展示一些列的示例值吗? 出现印刷错误 -- SELECT typeof(value_map) 将显示 value_map 的类型。 SELECT typeof('value_map') 显示 'value_map' 字符串文字的类型。 【参考方案1】:

如果键与element_at 一起存在,您可以在map 中查找值,如下所示:

SELECT element_at(value_map, 'element')
FROM ...
WHERE element_at(value_map, 'element') IS NOT NULL

【讨论】:

【参考方案2】:

element_at 在这种情况下是模棱两可的——当没有这样的键或键确实存在并且与它关联的 NULL 时,它将返回 NULL。有保证的方法是contains(map_keys(my_map), 'mykey'),诚然,它应该比原始变体慢一些。

【讨论】:

以上是关于检查 Presto 值映射中是不是存在键的主要内容,如果未能解决你的问题,请参考以下文章

检查 presto/hive 表中是不是存在列名

在 Presto 中,如何检查我通过子查询获取的列表中是不是存在数组中的元素

将记录作为键映射 - 如何检查Erlang中是否存在密钥

如何在迭代值之前检查 jq 中是不是存在“键”

Presto 检查是不是为 NULL 并返回默认值(NVL 模拟)

检查多维数组的任何子数组中的特定键是不是存在特定值