it-swarm.com.de

Wie frage ich mithilfe von Feldern im neuen PostgreSQL-JSON-Datentyp ab?

Ich suche einige Dokumente und/oder Beispiele für die neuen JSON-Funktionen in PostgreSQL 9.2.

Ausgehend von einer Reihe von JSON-Datensätzen:

[
  {name: "Toby", occupation: "Software Engineer"},
  {name: "Zaphod", occupation: "Galactic President"}
]

Wie würde ich die SQL schreiben, um einen Datensatz nach Namen zu finden?

In Vanilla SQL:

SELECT * from json_data WHERE "name" = "Toby"

Das offizielle Entwicklerhandbuch ist recht spärlich:

Aktualisiere ich

Ich habe eine Zusammenfassung zusammengestellt, was derzeit mit PostgreSQL 9.2 möglich ist. Mit einigen benutzerdefinierten Funktionen können folgende Aktionen ausgeführt werden:

SELECT id, json_string(data,'name') FROM things
WHERE json_string(data,'name') LIKE 'G%';

Update II

Ich habe jetzt meine JSON-Funktionen in ein eigenes Projekt verschoben:

PostSQL - eine Reihe von Funktionen zur Umwandlung von PostgreSQL und PL/v8 in einen großartigen JSON-Dokumentenspeicher

203
Toby Hede

Postgres 9.2

Ich zitiere Andrew Dunstan auf der Pgsql-Hacker-Liste :

Irgendwann wird es möglicherweise einige Funktionen für die Json-Verarbeitung geben (im Gegensatz zu json-produzierenden Funktionen), jedoch nicht in 9.2.

Hält ihn nicht davon ab, ein Beispielimplementierung in PLV8 bereitzustellen, das Ihr Problem lösen sollte.

Postgres 9.3

Bietet ein Arsenal neuer Funktionen und Operatoren zum Hinzufügen von "json-processing".

Die Antwort auf die ursprüngliche Frage in Postgres 9.3:

SELECT *
FROM   json_array_elements(
  '[{"name": "Toby", "occupation": "Software Engineer"},
    {"name": "Zaphod", "occupation": "Galactic President"} ]'
  ) AS elem
WHERE elem->>'name' = 'Toby';

Erweitertes Beispiel:

Bei größeren Tabellen möchten Sie möglicherweise einen Ausdrucksindex hinzufügen, um die Leistung zu erhöhen:

Postgres 9.4

Fügt jsonb (b für "binär", Werte werden als native Postgres-Typen gespeichert) und noch mehr Funktionalität für beides hinzu Typen. Zusätzlich zu den oben erwähnten Ausdrucksindizes unterstützt jsonb auch GIN-, Btree- und Hash-Indizes , wobei GIN der potenteste von diesen ist.

Das Handbuch geht so weit, Folgendes vorzuschlagen:

Im Allgemeinen sollten die meisten Anwendungen es vorziehen, JSON-Daten als jsonb zu speichern, es sei denn, es gibt recht spezielle Anforderungen, z von Objektschlüsseln.

Meine kühne Betonung.

Die Leistung profitiert von allgemeinen Verbesserungen der GIN-Indizes.

Postgres 9.5

Komplette jsonb Funktionen und Operatoren. Fügen Sie weitere Funktionen hinzu, um jsonb an Ort und Stelle zu bearbeiten und anzuzeigen.

170

Verwenden Sie ab Postgres 9.3 einfach das -> Operator. Zum Beispiel,

SELECT data->'images'->'thumbnail'->'url' AS thumb FROM instagram;

siehe http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/ für einige nette Beispiele und ein Tutorial.

82
Meekohi

Mit postgres 9.3 verwenden Sie -> für den Objektzugriff. 4 Beispiel

seed.rb

se = SmartElement.new
se.data = 
{
    params:
    [
        {
            type: 1,
            code: 1,
            value: 2012,
            description: 'year of producction'
        },
        {
            type: 1,
            code: 2,
            value: 30,
            description: 'length'
        }
    ]
}

se.save

Schienen c

SELECT data->'params'->0 as data FROM smart_elements;

kehrt zurück

                                 data
----------------------------------------------------------------------
 {"type":1,"code":1,"value":2012,"description":"year of producction"}
(1 row)

Sie können mit dem Verschachteln fortfahren

SELECT data->'params'->0->'type' as data FROM smart_elements;

rückkehr

 data
------
 1
(1 row)
17