我有这样的数据:a35={"abc":"D1,9,12, 23, 24, 25, 26"}
在一个列上。
我想做的是,使用Presto,仅当且仅当我在json的开头有"abc":"D1
时,在新列上提取id(在本例中为a35
)。
到目前为止,我试图让这个正则表达式提取id,但是没有成功,没有什么回报我的查询…
--sample data
WITH dataset(id_str) AS (
SELECT ('a35={"abc":"D1,9,12, 23, 24, 25, 26"}')
)
--query
SELECT regexp_extract_all(id_str, '"b(?<id>w{3})={"abc":"D1,"')
FROM dataset;
任何想法?
对于这个用例来说,这是一个完全多余的方法,但它可能对更高级的应用程序有用:
WITH dataset(id_str) AS (
SELECT ('a35={"abc":"D1,9,12, 23, 24, 25, 26"}')
)
SELECT map_keys(
map_filter(
CAST(
json_parse(regexp_replace(id_str, '(d|w*)=(.*)', '{"$1":$2}') -- Converts string to valid JSON.
) as MAP<VARCHAR, JSON>) -- Converts JSON to MAP of JSON
, (k,v) -> starts_with(CAST(json_extract(v, '$.abc') AS VARCHAR), 'D1')) -- Filters only the desired values
) as keys -- extracts the keys.
FROM dataset
输出:
键th>{a35}
实际上答案是正确的,我只是在正则表达式上多了两个引号。正确答案是:
--sample data
WITH dataset(id_str) AS (
SELECT ('a35={"abc":"D1,9,12, 23, 24, 25, 26"}')
)
--query
SELECT regexp_extract_all(id_str, 'b(?<id>w{3})={"abc":"D1,')
FROM dataset;
作为参考,我已经使用https://regex101.com/
验证了正则表达式: