给出如下数据结构:
{"single":"someText", "many":["text1", text2"]}
我可以使用
查询单个正则表达式WHERE JsonBColumn ->> 'single' ~ '^some.*'
我可以使用
查询数组上的包含匹配项WHERE JsonBColumn -> 'many' ? 'text2'
我想做的是在JArray上使用正则表达式进行包含匹配
WHERE JsonBColumn -> 'many' {Something} '.*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'