presto 从 varchar 列表中过滤项目

Posted

技术标签:

【中文标题】presto 从 varchar 列表中过滤项目【英文标题】:presto filter item from varchar list 【发布时间】:2021-02-28 00:42:55 【问题描述】:

我有一个格式如下的列表:

["a", "b", "c", "test_0", "test_1"]

它作为 varchar 存储在我的表中。我想过滤掉列表中任何带有“test”前缀的项目,所以我的输出是:

["a", "b", "c"]

不确定如何将此列表格式化为数组或过滤掉测试项目的最有效方式。

【问题讨论】:

【参考方案1】:

假设所有值都用双引号括起来并且没有转义引号,您可以使用 regexp_extract_all 将值提取到数组中:

regexp_extract_all(v, '"([^"]+)"', 1)

然后,您可以使用filter 函数删除任何不需要的元素:

filter(v, e -> e NOT LIKE 'test_%')

把它们放在一起:

WITH t(v) AS (VALUES '["a", "b", "c", "test_0", "test_1"]')
SELECT filter(regexp_extract_all(v, '"([^"]+)"', 1), e -> e NOT LIKE 'test_%')
FROM t

如果您的 varchar 值是正确的 JSON 数组,您可以使用 json_parse 和强制转换将其转换为 SQL 数组:

cast(json_parse(v) AS array(varchar))

【讨论】:

完美,谢谢!需要提高我对正则表达式的熟悉程度。 如果您的 varchar 值包含正确的 JSON 数组,我添加了有关使用 json_parse 的更多详细信息。

以上是关于presto 从 varchar 列表中过滤项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Presto Athena 中将 varchar 转换为数组

Presto map<varchar,set<varchar>> : 如何在 presto 中查询 map<varchar,set<varchar>>

在 Presto 中将存储为 INT 的时间转换为 VARCHAR

在 athena/presto 中将数组(varchar)转换为 varchar

从 Presto 中的 JSON 列中选择特定值

从 Vue 中的 v-for 列表中删除重复项