は、データ構造を考えると含まれていの選択は、次のように正規表現マッチ
WHERE JsonBColumn -> 'many' ? 'text2'
で私は何をしたいのJArray上の正規表現との一致が含まれて行うことです
WHERE JsonBColumn -> 'many' {Something} '.*2$'
は、データ構造を考えると含まれていの選択は、次のように正規表現マッチ
WHERE JsonBColumn -> 'many' ? 'text2'
で私は何をしたいのJArray上の正規表現との一致が含まれて行うことです
WHERE JsonBColumn -> 'many' {Something} '.*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.*');
私はそれでもあることがわかりましたJSONB配列全体をプレーンテキスト文字列に変換し、その正規表現を単純に実行することが可能です。副作用は、しかし
XT 1" 、「テキスト
のようなものの検索がマッチングを終わるだろうということです。
このアプローチは、個々の要素を個別に検索するわけではないので、きれいではありませんが、視覚的に簡単なステートメントで完了します。
WHERE JsonBColumn ->>'many' ~ 'text2'