Postgresql Abfrage Array von Objekten im JSONB-Feld
Ich habe eine Tabelle in einem postgresql-9.4 Datenbank mit jsonb Feld Empfänger genannt. Einige Beispiel-Zeilen:
[{"id": "145119603", "name": "145119603", "type": 2}]
[{"id": "1884595530", "name": "1884595530", "type": 1}]
[{"id": "363058213", "name": "363058213", "type": 1}]
[{"id": "1427965764", "name": "1427965764", "type": 1}]
[{"id": "193623800", "name": "193623800", "type": 0}, {"id": "419955814", "name": "419955814", "type": 0}]
[{"id": "624635532", "name": "624635532", "type": 0}, {"id": "1884595530", "name": "1884595530", "type": 1}]
[{"id": "791712670", "name": "791712670", "type": 0}]
[{"id": "895207852", "name": "895207852", "type": 0}]
[{"id": "144695994", "name": "144695994", "type": 0}, {"id": "384217055", "name": "384217055", "type": 0}]
[{"id": "1079725696", "name": "1079725696", "type": 0}]
Ich habe eine Liste von Werten für id und möchten, markieren Sie eine beliebige Zeile enthält ein Objekt mit einem der Werte aus dieser Liste in das array in der jsonb Feld.
Ist das möglich? Gibt es ein GIN-index kann ich machen, dass diese Fahrt?
InformationsquelleAutor der Frage user3761100 | 2015-02-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine einzige operation, die dir helfen können, aber Sie haben ein paar Optionen:
1. Wenn Sie eine kleine (und festen) Anzahl von ids zur Abfrage verwenden, können Sie mehrere kapselungs -
@>
kombiniert mitor
; f.ex.:Einem einfachen
gin
index kann Ihnen helfen, auf Ihre Daten-Spalte hier.2. Wenn Sie eine variable Anzahl von ids (oder Sie haben eine Menge von Ihnen), die Sie verwenden können
json[b]_array_elements()
zu extrahieren jedes element des Arrays, der Aufbau einer id-Liste, und klicken Sie dann Fragen Sie ihn mit dem any-kapselungsoperator?|
:Leider können Sie index-Ausdruck, welcher eine sub-Abfrage. Wenn Sie indizieren möchten, müssen Sie eine Funktion erstellen für Sie:
Danach können Sie query-ids wie diese:
Hinweis: ich die Punkt-notation /berechnete Feld hier, aber Sie müssen nicht.
3. Aber an diesem Punkt, Sie nicht haben zu stick mit json[b]: Sie haben eine einfache text-array, das unterstützt wird von PostgreSQL zu.
Abfrage und das berechnete Feld mit der überlappung array-operator
&&
:Hinweis: Von meiner internen Tests, diese letztere Lösung ist berechnet mit einem höheren Preis als die jsonb-Variante, aber in der Tat, es ist schneller als, ein wenig. Wenn die Leistung wirklich wichtig für Sie ist, sollten Sie test sowohl.
InformationsquelleAutor der Antwort pozs
Finde ich Problemumgehung:
where data::text similar to '%("id": "145119603"|"id": "1884595530")%'
InformationsquelleAutor der Antwort taiberium