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

Regex 选择Jsonb数组包含正则表达式匹配项,regex,postgresql,jsonb,Regex,Postgresql,Jsonb,给出如下数据结构: {"single":"someText", "many":["text1", text2"]} 我可以用 WHERE JsonBColumn ->> 'single' ~ '^some.*' 我可以用 WHERE JsonBColumn -> 'many' ? 'text2' 我想做的是在JArray上与正则表达式进行包含匹配 WHERE JsonBColumn -> 'many' {Something} '.*2$' 用于横向连接 with

给出如下数据结构:

{"single":"someText", "many":["text1", text2"]}
我可以用

WHERE JsonBColumn ->> 'single' ~ '^some.*'
我可以用

WHERE JsonBColumn -> 'many' ? 'text2'
我想做的是在JArray上与正则表达式进行包含匹配

WHERE JsonBColumn -> 'many' {Something} '.*2$'
用于横向连接

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)
另见


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

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.*');
用于横向连接

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)
另见


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

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.*');

我发现,还可以将整个JSONB数组转换为纯文本字符串,并对其执行正则表达式。但另一个副作用是,搜索

“文本1”,“文本

最终会匹配

这种方法不是很干净,因为它不单独搜索每个元素,但它用一个视觉上更简单的语句来完成任务

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

我发现,还可以将整个JSONB数组转换为纯文本字符串,并对其执行正则表达式。但另一个副作用是,搜索

“文本1”,“文本

最终会匹配

这种方法不是很干净,因为它不单独搜索每个元素,但它用一个视觉上更简单的语句来完成任务

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