So erstellen Sie einen Index für das JSON-Feld in Postgres 9.3


111

Wie erstelle ich in PostgreSQL 9.3 Beta 2 (?) Einen Index für ein JSON-Feld? Ich habe es mit dem ->für verwendeten Operator versucht, hstoreaber den folgenden Fehler erhalten:

 CREATE TABLE publishers(id INT, info JSON);
 CREATE INDEX ON publishers((info->'name'));

FEHLER: Datentyp json hat keine Standardoperatorklasse für die Zugriffsmethode "btree". HINWEIS: Sie müssen eine Operatorklasse für den Index angeben oder eine Standardoperatorklasse für den Datentyp definieren.


8
"Wo ist die Frage?" - Im Titel
Rlib

2
In Zukunft besuchen Sie bitte stackoverflow.com/tags/postgresql/info , den Abschnitt "Bessere Fragen stellen". Es könnte helfen, schneller bessere Antworten mit weniger nervigen Fragen zu erhalten.
Craig Ringer

Antworten:


184

Gefunden:

CREATE TABLE publishers(id INT, info JSON); 
CREATE INDEX ON publishers((info->>'name'));

Wie in den Kommentaren angegeben, ist der subtile Unterschied hier ->>statt ->. Ersteres gibt den Wert als Text zurück, letzteres als JSON-Objekt.



38
Nur für den Fall, dass Sie nach dem Unterschied suchen: Es ist ->>statt ->. Ersteres gibt den Wert als Text zurück, letzteres gibt ein JSON-Objekt zurück.
Daniel Rikowski

34
Die Doppelklammern sind ebenfalls wichtig.
Ron

11
@Jac_opo Es extrahiert sie jedoch alsTEXT . Wenn Sie Ganzzahlvergleiche anstelle von Zeichenfolgenvergleichen durchführen möchten, müssen Sie eine Umwandlung hinzufügen : ((info->>'name')::INT).
jpmc26

13
Wenn Sie einen Index für ein Feld in einem Unterobjekt Ihrer JSON-Spalte erstellen möchten, habe ich dank @DanielRikowski herausgefunden, dass ich dies tun muss. create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));Wir müssen zuerst ->das JSON-Objekt und dann ->>den untergeordneten Objektwert als abrufen Text.
Corey Cole
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.