3

私は次のものを持っています:

SELECT * 
FROM (
   SELECT '{"people": [{"name": "Bob", "occupation": "janitor"}, {"name": "Susan", "occupation": "CEO"}]}'::jsonb as data
) as b 
WHERE data->'people' @> '[{"name":"Bob"}]'::jsonb;

オブジェクト '{"name": "Bob", "occupation": "janitor"}' をフィルタリングしています

ボブの職業 (「用務員」) を返すにはどうすればよいですか?

SELECT data->'people'->>'occupation'  
FROM (
   SELECT '{"people": [{"name": "Bob", "occupation": "janitor"}, {"name": "Susan", "occupation": "CEO"}]}'::jsonb as data
) as b 
WHERE data->'people' @> '[{"name":"Bob"}]'::jsonb;

戻り値

?column?
--------
NULL

探している:

occupation
----------
janitor
4

2 に答える 2

1

jsonb がある行で他に何も気にしない場合は、jsonb からすべての要素を取り出して、それらを個別の要素として使用して選択することができます

SELECT data->>'occupation' as occupation
FROM (
  SELECT jsonb_array_elements(
    '{"people": 
       [
         {"name": "Bob", "occupation": "janitor"}, 
         {"name": "Susan", "occupation": "CEO"}
       ]
     }'::jsonb->'people') as data) as b
WHERE data @> '{"name":"Bob"}';

結果

職業
-----------
管理人
(1行)

于 2015-06-07T18:53:59.737 に答える
0

あなたの「人」要素は配列です。関数を使用して、配列の要素を取得できjsonb_array_elementsます。その後、次のようにフィルタリングできますperson->>'name'

SELECT  person->>'occupation' as occupation
FROM    (
        SELECT  person.value as person
        FROM    (
                SELECT     
                  '{"people": 
                     [
                       {"name": "Bob", "occupation": "janitor"}, 
                       {"name": "Susan", "occupation": "CEO"}
                     ]
                   }'::jsonb as data
                ) a
        CROSS JOIN
                jsonb_array_elements(data->'people') as person
        ) b
WHERE   person->>'name' = 'Bob';

->>はテキストを返しますが、 は を->返しますjsonb

于 2015-06-07T19:22:50.327 に答える