选择Jsonb数组包含正则表达式匹配

时间:2016-07-05 13:16:29

标签: regex postgresql jsonb

给出如下数据结构:

{"single":"someText", "many":["text1", text2"]}

我可以使用

查询单个正则表达式
WHERE JsonBColumn ->> 'single' ~ '^some.*'

我可以使用

查询数组上的包含匹配项
WHERE JsonBColumn -> 'many' ? 'text2'

我想做的是在JArray上使用正则表达式进行包含匹配

WHERE JsonBColumn -> 'many' {Something} '.*2$'

2 个答案:

答案 0 :(得分:2)

在横向连接中使用jsonb_array_elements_text()

with the_data(id, jsonbcolumn) as (
    values
        (1, '{"single":"someText", "many": ["text1", "text2"]}'::jsonb)
    )

select distinct on (id) d.*
from 
    the_data d, 
    jsonb_array_elements_text(jsonbcolumn->'many') many(elem)
where elem ~ '^text.*';

 id |                    jsonbcolumn                     
----+----------------------------------------------------
  1 | {"many": ["text1", "text2"], "single": "someText"}
(1 row)

另见this answer

如果经常使用该功能,您可能需要编写自己的功能:

create or replace function jsonb_array_regex_like(json_array jsonb, pattern text)
returns boolean language sql as $$
    select bool_or(elem ~ pattern)
    from jsonb_array_elements_text(json_array) arr(elem)
$$;

该功能肯定简化了代码:

with the_data(id, jsonbcolumn) as (
    values
        (1, '{"single":"someText", "many": ["text1", "text2"]}'::jsonb)
    )

select *
from the_data
where jsonb_array_regex_like(jsonbcolumn->'many', '^text.*');

答案 1 :(得分:0)

我发现也可以将整个JSONB数组转换为纯文本字符串,并简单地在其上执行正则表达式。但副作用是搜索类似

的内容
  

xt 1"," text

最终会匹配。

这种方法并不干净,因为它不会单独搜索每个元素,但它可以通过视觉上更简单的语句完成工作。

    WHERE JsonBColumn ->>'many'  ~ 'text2'