2016-05-03 2 views
2

Я использую базу данных Postgres, и я пытаюсь использовать новый тип JSONB. У меня есть таблица с именем employees с колонкой с именем previous_companies, который содержит следующие данные в формате JSON:Postgres JSONB сделать выбор из массива данных

[{"company":"Facebook", "link": "www.facebook.com"}, {"company":"Google", "link": "www.google.com"}, {"company":"Some Face", "link": "www.someface.com"}]

Я пытаюсь выбрать всех сотрудников, которые имеют определенную строку для поля «фирмы», например:

  • Если я хочу, чтобы все сотрудники, которые работали на компанию, которая имеет «лицо» на его имя, я бы: [{"company":"Facebook", "link": "www.facebook.com"}, {"company":"Some Face", "link": "www.someface.com"}]

Я был в состоянии сделать запрос для EXACT строки, например:

SELECT * FROM employees WHERE previous_companies @> '[{"company":"Facebook"}]' 

но он возвращает это: [{"company":"Facebook", "link": "www.facebook.com"}]

Как вы можете видеть, это не поддерживает запросы для неполных строк.

Спасибо!

ответ

2

jsonb_array_elements() функция может быть полезной для запроса с помощью массива JSONB колонки:

SELECT 
    id, 
    to_jsonb(array_agg(previous_company)) AS previous_companies 
FROM (
    SELECT 
    id, 
    jsonb_array_elements(previous_companies) AS previous_company 
    FROM (VALUES 
     ('id1', '[{"company":"Facebook", "link": "www.facebook.com"},{"company":"Google", "link": "www.google.com"}, {"company":"Some Face", "link": "www.someface.com"}]'::jsonb), 
     ('id2', '[{"company":"Some Face", "link": "www.someface.com"}]'::jsonb), 
     ('id3', '[{"company":"Google", "link": "www.google.com"}]'::jsonb) 
) employees (id, previous_companies) 
) T 
WHERE 
    lower(previous_company->>'company') LIKE '%face%' 
GROUP BY 
    id 
; 
Смежные вопросы