2016-05-03 9 views
3

Ich verwende Postgres 9.4 und den Jsonb-Typ. Ich habe die folgende Tabelle:Array-Objekt als Teil der WHERE-Klausel überprüfen

CREATE TABLE jsonb_test (iid serial NOT NULL, data jsonb) 

und die folgenden JSON-Daten in dieser Tabelle:

{"date": "2016-01-01T00:00:00.000Z", "items": [{"name": "bottles", "price": 12}, {"name": "caps", "price": 20}], "customer": {"name": "Customer 1", "email": "[email protected]"}} 
{"date": "2015-12-01T00:00:00.000Z", "items": [{"name": "bottles", "price": 1}, {"name": "caps", "price": 50}], "customer": {"name": "Customer 2", "email": "[email protected]"}} 

Was würde ich zu tun ist, alle Zeilen zu erhalten, die ein Element mit einem Preis hat mehr als 30 In diesem Fall würde das die Zeile "Kunde 2" zurückgeben.

Das ist meine Abfrage so weit:

SELECT * FROM jsonb_test WHERE jsonb_array_elements(jsonb_extract_path(data, 'items')) #> '{price}' > '0' 

Aber das schlägt mit dem Fehler ERROR: argument of WHERE must not return a set

Kann mir jemand sagen, wie dies zu tun? Ist es möglich, dies für eine beliebige Verschachtelungsebene zu tun?

Danke!

+0

Haben Sie lesen [? Warum kann ich nicht direkt auf jsonb_array_elements abfragen] (http://stackoverflow.com/questions/30687945/why-cant-i-query-directly -on-jsonb-array-elements) – abarisone

+0

@abarisone Das habe ich gesehen, was mir nicht klar war, wie man mehr als/weniger als Operationen macht. – shortspider

Antwort

0

versuchen, etwas wie folgt aus:

SELECT * FROM jsonb_test, jsonb_array_elements(jsonb_test.data->'items') AS a WHERE (a->>'price') > '0'

+0

Dies funktioniert und als der zusätzliche Vorteil der Bereitstellung der Elemente Elemente selbst. Ich frage mich jedoch, kann das verschachtelt werden? Wenn ich ein Array von Objekten hätte, die auch ein Array von Objekten hätten, wie würden diese abgefragt werden? – shortspider

+0

@shortspider probiere dieses Beispiel http://stackoverflow.com/questions/32571338/postgres-jsonb-query-on-nested-object – Jehy

+0

das sieht perfekt aus, vielen Dank! – shortspider

0

Tyr dies:

SELECT * FROM json_test WHERE jsonb_test.data #> '{items,price}' > '30'; 

Was ich versuche zu tun: Geben Sie mir Objekte wo Element Elemente ein untergeordnetes Objekt hat, das Element Preis hat gleich der Ganzzahl '1'.

Kasse einige Beispiele hier: http://schinckel.net/2014/05/25/querying-json-in-postgres/

+0

Dies ergibt keine Ergebnisse für mich, auch wenn ich den Vergleich zu> 0 ändern – shortspider

+0

Ich habe einen Tippfehler jsonb_test nach FROM. versuchen und sehen –

+0

Ich tat und immer noch nichts. Hier ist die Abfrage: 'SELECT * FROM jsonb_test WHERE jsonb_test.data #> '{items, price}'> '0';' – shortspider