2016-05-03 9 views
2

Ich benutze eine Postgres-Datenbank und ich versuche, den neuen JSONB-Typ zu verwenden. Ich habe eine Tabelle employees mit einer Spalte namens previous_companies benannt, die folgenden JSON-Daten enthält:Postgres JSONB eine Auswahl aus einem Array von Daten

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

Ich versuche, alle Mitarbeiter auszuwählen, die bestimmte Zeichenfolge für das Feld „Firma“ haben, zum Beispiel:

  • Wenn ich alle Mitarbeiter wollen, die auf einer Firma gearbeitet, die „Gesicht“ auf seinen Namen hat, würde ich habe: [{"company":"Facebook", "link": "www.facebook.com"}, {"company":"Some Face", "link": "www.someface.com"}]

konnte ich eine Abfrage für die EXACT Zeichenfolge tun, wie folgt aus:

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

aber es gibt diese: [{"company":"Facebook", "link": "www.facebook.com"}]

Wie Sie sehen dies nicht für unvollständige Strings Abfragen unterstützt.

Danke!

Antwort

2

jsonb_array_elements() Funktion zum Abfragen von Array JSONB Spalte kann hilfreich sein:

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 
; 
Verwandte Themen