2015-06-07 3 views
3

У меня есть следующие:Как я могу выбрать «занятие»?

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

Я фильтрации для объекта «{„имя“:„Боб“,„оккупации“:„дворник“}»

Как вернуть профессию Боба ("дворник")?

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 

ответ

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 строка)

+1

Хороший ответ, надеюсь, что вы не против форматирования. Вы можете выбрать 'data - >> 'ocction'', чтобы избежать двойных кавычек в результате. – Andomar

+0

@Andomar Спасибо, пропустил это. Редактирование: –

+0

@SamiKuhmonen: Это работает, еще раз спасибо! Какой индекс мне нужен для jsonb_array_elements? Я не мог найти здесь никакой информации: http://www.postgresql.org/docs/9.4/static/datatype-json.html –

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.

Смежные вопросы