2016-07-21 13 views
0

Ich habe eine Spalte Adresse, Typ jsonb[], in Tabelle Häuser, die so etwas wie dies ein Array enthält suchen:Postgres 9.5 Abfrage passende JSON Property innerhalb Array

"{ 
    "{\"zip\": \"13203-1807\", 
    \"city\": \"\SYRACUSE\", 
    \"state\": \"NEW YORK\", 
    \"street\": \"\999 PROSPECT AVENUE\"}" 
}" 

Ich versuche, alle Häuser abfragen wo die Adressstadt "Syrakus" ist; so weit ich habe:

SELECT * FROM Houses WHERE address -> 'city' = 'SYRACUSE' 

Und diesen Fehler erhalten:

No operator matches the given name and argument type(s). You might need to add explicit type casts. 

ich durch PG Official Documentation on JSON Functions and Operators ausgesehen haben, sowie mehrere Antworten auf Stackoverflow ohne Erfolg.

+0

Ist Ihre Spalte Typ 'Jsonb' oder' Jsonb [] '? Der '->' Operator wird mit ersterem funktionieren, aber letzteres ist ein Postgresql Array und benötigt Arrayoperatoren. – jmelesky

+0

'jsonb []' @jmelesky – Will

+0

Aus Neugier, warum? JSON kann bereits Arrays enthalten, daher ist mir nicht klar, warum Sie ein Postgresql-Array von JSON-Objekten über einem JSON-Array von JSON-Objekten speichern möchten. – jmelesky

Antwort

1

Okay, wie in den obigen Kommentaren erwähnt, versuchen Sie, einen JSON-Operator in einem postgresql-Array zu verwenden, weshalb Sie einen Typfehler erhalten. Je nachdem, was Sie in diesem Feld speichern möchten, gibt es verschiedene Möglichkeiten.

Für diese Beispiele, ich werde in der folgenden Tabelle zu übernehmen:

CREATE TABLE houses (id INT, address <some datatype>); 

Wenn Sie es ein Postgres-Array von jsonb sein wollen, müssen Sie das Array entpacken, die Sie wie so tun können, :

WITH all_addresses AS (
    SELECT id, unnest(address) as add 
    FROM houses) 
SELECT * 
    FROM houses h 
    WHERE 
    id IN (SELECT id 
      FROM all_addresses 
      WHERE add->'city' = to_jsonb('SYRACUSE'::text)); 

Wenn auf der anderen Seite, können Sie ein JSON-Array verwenden möchten, dann könnte die Abfrage wie folgt aussehen (sehr ähnlich, da man immer noch das Array UNNEST müssen):

WITH all_addresses AS (
    SELECT id, jsonb_array_elements(address) as add 
    FROM houses) 
SELECT * 
    FROM houses h 
    WHERE 
    id IN (SELECT id 
      FROM all_addresses 
      WHERE add->'city' = to_jsonb('SYRACUSE'::text)); 

Ich kann nicht ganz aus Ihrer Frage sagen, aber es ist möglich, dass Sie nur eine Adresse pro Zeile in dieser Spalte speichern (basierend auf Ihren Beispieldaten und der Tatsache, dass die Spalte "Adresse" heißt, nicht "Adressen"). Wenn das der Fall ist, wird Ihre Abfrage viel einfacher:

SELECT * 
    FROM houses 
    WHERE address->'city' = to_jsonb('SYRACUSE'::text);