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'