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”}'

如何返回 Bob 的职业(“看门人”)?

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 回答