2017-10-17 23 views
0

I ont le tableau suivant:Interrogation Postgres 9,6 tableau JSONB d'objets

CREATE TABLE trip 
(
    id SERIAL PRIMARY KEY , 
    gps_data_json jsonb NOT NULL 
); 

Le JSON en gps_data_json contient un tableau d'objets de déclenchement avec les champs suivants (données-échantillon ci-dessous):

  • Mode
  • horodatage
  • latitude
  • longitude

J'essaie d'obtenir toutes les lignes qui contiennent un certain "mode".

SELECT * FROM trip 
where gps_data_json ->> 'mode' = 'WALK'; 

Je suis assez sûr que je l'aide de la - >> opérateur mal, mais je ne suis pas sûr de dire qui la requête que le champ JSONB est un tableau d'objets?

données Exemple:

INSERT INTO trip (gps_data_json) VALUES 
    ('[ 
     { 
     "latitude": 47.063480377197266, 
     "timestamp": 1503056880725, 
     "mode": "TRAIN", 
     "longitude": 15.450349807739258 
     }, 
     { 
     "latitude": 47.06362533569336, 
     "timestamp": 1503056882725, 
     "mode": "WALK", 
     "longitude": 15.450264930725098 
     } 
    ]'); 

INSERT INTO trip (gps_data_json) VALUES 
    ('[ 
     { 
     "latitude": 47.063480377197266, 
     "timestamp": 1503056880725, 
     "mode": "BUS", 
     "longitude": 15.450349807739258 
     }, 
     { 
     "latitude": 47.06362533569336, 
     "timestamp": 1503056882725, 
     "mode": "WALK", 
     "longitude": 15.450264930725098 
     } 
    ]'); 

Répondre

1

Le problème se pose parce que l'opérateur ->> ne peut pas marcher à travers le tableau:

  • Première unnest votre tableau JSON en utilisant json_array_elements fonction;
  • Ensuite, utilisez l'opérateur pour filtrer.

Après requête le tour est joué:

WITH 
A AS (
SELECT 
    Id 
    ,jsonb_array_elements(gps_data_json) AS point 
FROM trip 
) 
SELECT * 
FROM A 
WHERE (point->>'mode') = 'WALK'; 
+0

Vous pouvez utiliser [jsonb_array_elements] (https://www.postgresql.org/docs/current/static/functions- json.html) et évitez le cast. –

+0

Oui j'ai juste raté, corrigé, merci – jlandercy

3

désimbrication le tableau fonctionne très bien, si vous ne souhaitez que les objets contenant les valeurs interrogées. Les contrôles suivants pour le confinement et renvoie la pleine JSONB:

SELECT * FROM trip 
WHERE gps_data_json @> '[{"mode": "WALK"}]'; 

Voir aussi Postgresql query array of objects in JSONB field