来自 varchar 列表的 presto 过滤器项目
presto filter item from varchar list
我有一个格式如下的列表:
["a", "b", "c", "test_0", "test_1"]
它作为 varchar 存储在我的 table 中。我想过滤掉列表中带有“测试”前缀的任何项目,所以我的输出将是:
["a", "b", "c"]
不确定如何将此列表格式化为数组或过滤出测试项目的最有效方法。
假设所有值都用双引号括起来并且没有转义引号,您可以使用 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))
我有一个格式如下的列表:
["a", "b", "c", "test_0", "test_1"]
它作为 varchar 存储在我的 table 中。我想过滤掉列表中带有“测试”前缀的任何项目,所以我的输出将是:
["a", "b", "c"]
不确定如何将此列表格式化为数组或过滤出测试项目的最有效方法。
假设所有值都用双引号括起来并且没有转义引号,您可以使用 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))