2016-07-05 16 views

答えて

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

私はそれでもあることがわかりましたJSONB配列全体をプレーンテキスト文字列に変換し、その正規表現を単純に実行することが可能です。副作用は、しかし

XT 1" 、「テキスト

のようなものの検索がマッチングを終わるだろうということです。

このアプローチは、個々の要素を個別に検索するわけではないので、きれいではありませんが、視覚的に簡単なステートメントで完了します。

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