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